/// <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))); }
/// <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))); }
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))); }
public void IsNullable_Test() { Assert.True(EmitUtil.IsNullable(typeof(int?))); Assert.False(EmitUtil.IsNullable(typeof(string))); }