Пример #1
0
        /// <summary>
        /// Generates a dynamic method on the given type.
        /// </summary>
        private GetPropertyValuesInvoker GenerateGetPropertyValuesMethod(IGetter[] getters)
        {
            var           methodArguments = new[] { typeof(object), typeof(GetterCallback) };
            DynamicMethod method          = CreateDynamicMethod(typeof(object[]), methodArguments);

            ILGenerator il = method.GetILGenerator();

            LocalBuilder thisLocal = il.DeclareLocal(typeOfThis);
            LocalBuilder dataLocal = il.DeclareLocal(typeof(object[]));

            // Cast the 'this' pointer to the appropriate type and store it in a local variable
            il.Emit(OpCodes.Ldarg_0);
            EmitCastToReference(il, mappedType);
            il.Emit(OpCodes.Stloc, thisLocal);

            // Allocate the values array and store it in a local variable
            il.Emit(OpCodes.Ldc_I4, getters.Length);
            il.Emit(OpCodes.Newarr, typeof(object));
            il.Emit(OpCodes.Stloc, dataLocal);

            //get all the data from the object into the data array to be returned
            for (int i = 0; i < getters.Length; i++)
            {
                // get the member accessors
                IGetter getter = getters[i];

                // queue up the array storage location for the value
                il.Emit(OpCodes.Ldloc, dataLocal);
                il.Emit(OpCodes.Ldc_I4, i);

                // get the value...
                var optimizableGetter = getter as IOptimizableGetter;
                if (optimizableGetter != null)
                {
                    // using the getter's emitted IL code
                    il.Emit(OpCodes.Ldloc, thisLocal);
                    optimizableGetter.Emit(il);
                    EmitUtil.EmitBoxIfNeeded(il, getter.ReturnType);
                }
                else
                {
                    // using the getter itself via a callback
                    MethodInfo invokeMethod = typeof(GetterCallback).GetMethod("Invoke",
                                                                               new[] { typeof(object), typeof(int) });
                    il.Emit(OpCodes.Ldarg_1);
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldc_I4, i);
                    il.Emit(OpCodes.Callvirt, invokeMethod);
                }

                //store the value
                il.Emit(OpCodes.Stelem_Ref);
            }

            // Return the data array
            il.Emit(OpCodes.Ldloc, dataLocal.LocalIndex);
            il.Emit(OpCodes.Ret);

            return((GetPropertyValuesInvoker)method.CreateDelegate(typeof(GetPropertyValuesInvoker)));
        }
Пример #2
0
        /// <summary>
        /// Generates a dynamic method on the given type.
        /// </summary>
        /// <returns></returns>
        private SetPropertyValuesInvoker GenerateSetPropertyValuesMethod(IGetter[] getters, ISetter[] setters)
        {
            var           methodArguments = new[] { typeof(object), typeof(object[]), typeof(SetterCallback) };
            DynamicMethod method          = CreateDynamicMethod(null, methodArguments);

            ILGenerator il = method.GetILGenerator();

            // Declare a local variable used to store the object reference (typed)
            LocalBuilder thisLocal = il.DeclareLocal(typeOfThis);

            il.Emit(OpCodes.Ldarg_0);
            EmitCastToReference(il, mappedType);
            il.Emit(OpCodes.Stloc, thisLocal.LocalIndex);

            for (int i = 0; i < setters.Length; i++)
            {
                // get the member accessor
                ISetter     setter    = setters[i];
                System.Type valueType = getters[i].ReturnType;

                var optimizableSetter = setter as IOptimizableSetter;

                if (optimizableSetter != null)
                {
                    // load 'this'
                    il.Emit(OpCodes.Ldloc, thisLocal);

                    // load the value from the data array
                    il.Emit(OpCodes.Ldarg_1);
                    il.Emit(OpCodes.Ldc_I4, i);
                    il.Emit(OpCodes.Ldelem_Ref);

                    EmitUtil.PreparePropertyForSet(il, valueType);

                    // using the setter's emitted IL
                    optimizableSetter.Emit(il);
                }
                else
                {
                    // using the setter itself via a callback
                    MethodInfo invokeMethod = typeof(SetterCallback).GetMethod("Invoke",
                                                                               new[] { typeof(object), typeof(int), typeof(object) });
                    il.Emit(OpCodes.Ldarg_2);
                    il.Emit(OpCodes.Ldarg_0);
                    il.Emit(OpCodes.Ldc_I4, i);

                    // load the value from the data array
                    il.Emit(OpCodes.Ldarg_1);
                    il.Emit(OpCodes.Ldc_I4, i);
                    il.Emit(OpCodes.Ldelem_Ref);

                    il.Emit(OpCodes.Callvirt, invokeMethod);
                }
            }

            // Setup the return
            il.Emit(OpCodes.Ret);

            return((SetPropertyValuesInvoker)method.CreateDelegate(typeof(SetPropertyValuesInvoker)));
        }
        public static List <T> EmitToList <T>(this DataTable dt)
        {
            //确认参数有效
            if (dt == null)
            {
                return(null);
            }

            List <T> list       = new List <T>();
            var      objBuilder = EmitUtil.CreateBuilder(typeof(T));

            for (int i = 0; i < dt.Rows.Count; i++)
            {
                //创建泛型对象
                T _t = (T)objBuilder();
                //获取对象所有属性
                PropertyInfo[] propertyInfo = _t.GetType().GetProperties();
                for (int j = 0; j < dt.Columns.Count; j++)
                {
                    foreach (PropertyInfo info in propertyInfo)
                    {
                        //属性名称和列名相同时赋值
                        if (dt.Columns[j].ColumnName.ToUpper().Equals(info.Name.ToUpper()))
                        {
                            if (dt.Rows[i][j] != DBNull.Value)
                            {
                                info.SetValue(_t, dt.Rows[i][j], null);
                            }
                            else
                            {
                                info.SetValue(_t, null, null);
                            }
                            break;
                        }
                    }
                }
                list.Add(_t);
            }
            return(list);
        }
        private GetPropertyValueInvoker GenerateGetPropertyValueMethod(IGetter getter)
        {
            if (getter == null)
            {
                return(null);
            }
            if (!(getter is IOptimizableGetter optimizableGetter))
            {
                return(getter.Get);
            }

            var method = CreateDynamicMethod(typeof(object), new[] { typeof(object) });
            var il     = method.GetILGenerator();

            // object (target) { (object) ((ClassType) target).GetMethod(); }
            il.Emit(OpCodes.Ldarg_0);
            EmitCastToReference(il, mappedType);
            optimizableGetter.Emit(il);
            EmitUtil.EmitBoxIfNeeded(il, getter.ReturnType);
            il.Emit(OpCodes.Ret);

            return((GetPropertyValueInvoker)method.CreateDelegate(typeof(GetPropertyValueInvoker)));
        }
        private SetPropertyValueInvoker GenerateSetPropertyValueMethod(ISetter setter)
        {
            if (setter == null)
            {
                return(null);
            }
            if (!(setter is IOptimizableSetter optimizableSetter))
            {
                return(setter.Set);
            }

            // void (target, value) { ((ClassType) target).SetMethod((FieldType) value); }
            var method = CreateDynamicMethod(null, new[] { typeof(object), typeof(object) });
            var il     = method.GetILGenerator();

            il.Emit(OpCodes.Ldarg_0);
            EmitCastToReference(il, mappedType);
            il.Emit(OpCodes.Ldarg_1);
            EmitUtil.PreparePropertyForSet(il, optimizableSetter.Type);
            optimizableSetter.Emit(il);
            il.Emit(OpCodes.Ret);

            return((SetPropertyValueInvoker)method.CreateDelegate(typeof(SetPropertyValueInvoker)));
        }
Пример #6
0
 public void GetNullableArg0_Test()
 {
     Assert.Equal(typeof(int), EmitUtil.GetNullableArg0(typeof(int?)));
     Assert.Equal(typeof(float), EmitUtil.GetNullableArg0(typeof(float?)));
     Assert.Equal(typeof(string), EmitUtil.GetNullableArg0(typeof(string)));
 }
Пример #7
0
 public void IsNullable_Test()
 {
     Assert.True(EmitUtil.IsNullable(typeof(int?)));
     Assert.False(EmitUtil.IsNullable(typeof(string)));
 }