我正在使用Reflection.Emit在运行时生成字段的getter。目前,在我测试的所有情况下,我的代码都可以正常工作,除非该字段不是公共的。当字段不是公共的时候,调用委托会抛出"System.NullReferenceException : Object reference not set to an instance of an object."异常。
我使用以下代码进行生成:(field是一个FieldInfo)
我使用以下代码进行生成:(field是一个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>));