//设置私有字段 public static void SetPrivateField(this ILGenerator il, Action thisInStack, FieldInfo info, object value) { //加载SetValue的第一个参数 即FieldInfo il.REmit(OpCodes.Ldtoken, info.DeclaringType); il.REmit(OpCodes.Call, ClassCache.ClassHandle); il.REmit(OpCodes.Ldstr, info.Name); il.REmit(OpCodes.Ldc_I4_S, 44); il.REmit(OpCodes.Callvirt, ClassCache.FieldInfoGetter); //加载SetValue的第二个参数 if (thisInStack != null) { thisInStack(); } il.Packet(info.DeclaringType); //加载SetValue的第三个参数 il.NoErrorLoad(value, info.FieldType); if (value != null) { if (il.IsNullable(info.FieldType)) { il.Packet(info.FieldType); } else { il.Packet(value.GetType()); } } //调用SetValue il.REmit(OpCodes.Callvirt, ClassCache.FieldValueSetter); }
public static void SetPrivateProperty(this ILGenerator il, Action thisInStack, PropertyInfo info, object value) { //加载SetValue的第一个参数 即PropertyInfo il.REmit(OpCodes.Ldtoken, info.DeclaringType); il.REmit(OpCodes.Call, ClassCache.ClassHandle); il.REmit(OpCodes.Ldstr, info.Name); il.REmit(OpCodes.Ldc_I4_S, 44); il.REmit(OpCodes.Call, ClassCache.PropertyInfoGetter); //加载SetValue的第二个参数 if (thisInStack != null) { thisInStack(); } il.Packet(info.DeclaringType); //加载SetValue的第三个参数 il.NoErrorLoad(value, info.PropertyType); if (value != null) { il.Packet(info.PropertyType); } //调用SetValue il.REmit(OpCodes.Callvirt, ClassCache.PropertyValueSetter); }
public static void LoadPrivateProperty(this ILGenerator il, Action thisInStack, PropertyInfo info) { //加载GetValue的第一个参数 即PropertyInfo il.REmit(OpCodes.Ldtoken, info.DeclaringType); il.REmit(OpCodes.Call, ClassCache.ClassHandle); il.REmit(OpCodes.Ldstr, info.Name); il.REmit(OpCodes.Ldc_I4_S, 60); il.REmit(OpCodes.Callvirt, ClassCache.PropertyInfoGetter); //加载GetValue的第二个参数 if (thisInStack != null) { thisInStack(); } ; il.Packet(info.DeclaringType); //调用GetValue il.REmit(OpCodes.Callvirt, ClassCache.PropertyValueGetter); il.UnPacket(info.PropertyType); if (info.PropertyType.IsValueType && !info.PropertyType.IsPrimitive) { LocalBuilder builder = il.DeclareLocal(info.PropertyType); il.EmitStoreBuilder(builder); il.LoadBuilder(builder); } il.BoolInStack(info.PropertyType); //il.CallNullableValue(info.PropertyType,true); }
//加载私有字段 public static void LoadPrivateFieldValue(this ILGenerator il, Action thisInStack, FieldInfo info) { //加载GetValue的第一个参数 即FieldInfo il.REmit(OpCodes.Ldtoken, info.DeclaringType); il.REmit(OpCodes.Call, ClassCache.ClassHandle); il.REmit(OpCodes.Ldstr, info.Name); il.REmit(OpCodes.Ldc_I4_S, 44); il.REmit(OpCodes.Callvirt, ClassCache.FieldInfoGetter); //加载GetValue的第二个参数 if (thisInStack != null) { thisInStack(); } il.Packet(info.DeclaringType); //调用GetValue il.REmit(OpCodes.Callvirt, ClassCache.FieldValueGetter); //拆箱 il.UnPacket(info.FieldType); il.BoolInStack(info.FieldType); }