我正在使用 Reflection.Emit 为动态字段生成吸气剂。到目前为止,我的代码在我测试过的所有情况下都有效,除非该字段不公开。当该字段不公开时,调用委托会引发“System.NullReferenceException:对象引用未设置为对象的实例。”
我正在使用此代码生成:(字段是 FieldInfo)
DynamicMethod dm = new DynamicMethod(String.Concat ("_Set", field.Name, "_"), typeof(void),
new Type[] { typeof(object), typeof(object) },
field.DeclaringType, true);
ILGenerator generator = dm.GetILGenerator ();
generator.Emit (OpCodes.Ldarg_0);
generator.Emit (OpCodes.Ldarg_1);
if (field.FieldType.IsValueType)
generator.Emit (OpCodes.Unbox_Any, field.FieldType);
generator.Emit (OpCodes.Stfld, field);
generator.Emit (OpCodes.Ret);
return (Action<object, object>)dm.CreateDelegate (typeof(Action<object, object>));