Reflection.Emit私有字段/属性访问

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

2
你是否使用了正确的参数进行调用?对于私有字段,你需要指定BindingFlags.NonPublic,如下所示:
var field = this.GetType().GetField("someField", BindingFlags.NonPublic | BindingFlags.Instance);

或者

var field = this.GetType().GetField("someField", BindingFlags.NonPublic | BindingFlags.Static);

你能否发一下程序抛出异常的完整示例代码?

啊,这解决了我的问题。不过,它没有解决一个类似的问题,我认为它是相关的,与属性有关。我会发布一个新的问题来解决它。谢谢。 - Nol

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接