加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:37:38 所属栏目:百科 来源:网络整理
导读:我正在使用Reflection.Emit来动态生成字段的getter.到目前为止,我的代码适用于我测试的所有情况,除非该字段不公开.当字段不公开时,调用委托会抛出“System.NullReferenceException:Object reference not not set to object of object”. 我正在使用此代码生
我正在使用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);

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读