private static void _EnumHandling(ILGenerator ilGenerator, MemberInfoExtended memberInfoExtended)
        {
            ilGenerator.Emit(OpCodes.Ldtoken, memberInfoExtended.Type);
            ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Reflections.__GetTypeFromHanlde);
            ilGenerator.Emit(OpCodes.Ldloca_S, 2);
            ilGenerator.Emit(OpCodes.Ldfld, _serElementField[1]);
            ilGenerator.Emit(OpCodes.Callvirt, SharedFunctionsAggregator.Converters.__ToString);

            ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__EnumParse);
            ilGenerator.Emit(OpCodes.Unbox_Any, memberInfoExtended.Type);
        }
 private static void _AssignToMember(ILGenerator ilGenerator, MemberInfoExtended memberInfoExtended)
 {
     if (memberInfoExtended.MemberInfo.MemberType == MemberTypes.Property)
     {
         ilGenerator.Emit(OpCodes.Callvirt, ((PropertyInfo)memberInfoExtended.MemberInfo).SetMethod);
     }
     else
     {
         ilGenerator.Emit(OpCodes.Stfld, (FieldInfo)memberInfoExtended.MemberInfo);
     }
 }
        public static Delegate MakeActionToMemberAssigning <TObject, TMember>(MemberInfoExtended memberInfoExtended)
        {
            var dynamicMethod = new DynamicMethod("MemberAssigning", typeof(void), new Type[] { typeof(object), typeof(object) }, typeof(TObject));
            var ilGenerator   = dynamicMethod.GetILGenerator();

            ilGenerator.Emit(OpCodes.Ldarg_0);
            ilGenerator.Emit(OpCodes.Castclass, typeof(TObject));

            ilGenerator.Emit(OpCodes.Ldarg_1);
            ilGenerator.Emit(OpCodes.Castclass, typeof(TMember));

            _AssignToMember(ilGenerator, memberInfoExtended);

            ilGenerator.Emit(OpCodes.Ret);

            return(dynamicMethod.CreateDelegate(typeof(Action <object, object>)));
        }
 private static void _LeftTypesHandling(ILGenerator ilGenerator, MemberInfoExtended memberInfoExtended)
 {
     ilGenerator.Emit(OpCodes.Ldloca_S, 2);
     ilGenerator.Emit(OpCodes.Ldfld, _serElementField[1]);
     //ilGenerator.Emit(OpCodes.Callvirt, SharedFunctionsAggregator.Converters.__ToString);
 }
        private static void _PrimitiveHandling(ILGenerator ilGenerator, MemberInfoExtended memberInfoExtended)
        {
            ilGenerator.Emit(OpCodes.Ldloca_S, 2);
            ilGenerator.Emit(OpCodes.Ldfld, _serElementField[1]);


            // frequently-used
            if (memberInfoExtended.Type == typeof(string))
            {
                ilGenerator.Emit(OpCodes.Callvirt, SharedFunctionsAggregator.Converters.__ToString);
            }
            else if (memberInfoExtended.Type == typeof(int))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToInt32);
            }
            else if (memberInfoExtended.Type == typeof(bool))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToBoolean);
            }
            else if (memberInfoExtended.Type == typeof(char))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToChar);
            }
            else if (memberInfoExtended.Type == typeof(double))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToDouble);
            }
            else if (memberInfoExtended.Type == typeof(byte))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToByte);
            }
            else if (memberInfoExtended.Type == typeof(long))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToInt64);
            }
            else if (memberInfoExtended.Type == typeof(decimal))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToDecimal);
            }

            // rarely-used
            else if (memberInfoExtended.Type == typeof(float))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToSingle);
            }
            else if (memberInfoExtended.Type == typeof(short))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToInt16);
            }
            else if (memberInfoExtended.Type == typeof(uint))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToUInt32);
            }
            else if (memberInfoExtended.Type == typeof(ulong))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToUInt64);
            }
            else if (memberInfoExtended.Type == typeof(ushort))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToUInt16);
            }
            else if (memberInfoExtended.Type == typeof(sbyte))
            {
                ilGenerator.Emit(OpCodes.Call, SharedFunctionsAggregator.Converters.__ToSByte);
            }
        }
        private static void _CodeGenerationAccordingToMemberForObjectCreating(ILGenerator ilGenerator, MemberInfoExtended memberInfoExtended)
        {
            if (!memberInfoExtended.IsSimpleType && !memberInfoExtended.IsCollection)
            {
                ilGenerator.Emit(OpCodes.Newobj, memberInfoExtended.Type.GetConstructors()[0]);
            }

            else if (memberInfoExtended.Type.IsEnum)
            {
                _EnumHandling(ilGenerator, memberInfoExtended);
            }

            else if (memberInfoExtended.Type.IsPrimitive || memberInfoExtended.Type == typeof(decimal))
            {
                _PrimitiveHandling(ilGenerator, memberInfoExtended);
            }

            else if (memberInfoExtended.Type == typeof(DateTime))
            {
                _DateTimeHandling(ilGenerator);
            }

            else
            {
                _LeftTypesHandling(ilGenerator, memberInfoExtended);
            }

            _AssignToMember(ilGenerator, memberInfoExtended);
        }
        private static void _CodeGenerationAccordingToMemberForMemberAccess(ILGenerator ilGenerator, MemberInfoExtended memberInfoExtended)
        {
            if (memberInfoExtended.MemberInfo.MemberType == MemberTypes.Property)
            {
                ilGenerator.Emit(OpCodes.Callvirt, ((PropertyInfo)memberInfoExtended.MemberInfo).GetMethod);
            }
            else
            {
                ilGenerator.Emit(OpCodes.Ldfld, (FieldInfo)memberInfoExtended.MemberInfo);
            }

            if (memberInfoExtended.Type.IsValueType)
            {
                ilGenerator.Emit(OpCodes.Box, memberInfoExtended.Type);
            }

            if (memberInfoExtended.Type == typeof(DateTime))
            {
                ilGenerator.Emit(OpCodes.Callvirt, SharedFunctionsAggregator.Converters.__ToString);
            }
        }