微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我正在使用Reflection.Emit来动态生成字段的getter.到目前为止,我的代码适用于我测试的所有情况,除非该字段不公开.当字段不公开时,调用委托会抛出“System.NullReferenceException:Object reference not not set to object of object”.

我正在使用此代码生成:(字段是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>));

解决方法

你打电话给适当的参数?对于私有字段,您需要指定BindingFlags.NonPublic,如:

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

要么

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

你能发布抛出异常的程序的完整例子吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐