我正在使用Reflection.Emit来动态生成字段的getter.到目前为止,我的代码适用于我测试的所有情况,除非该字段不公开.当字段不公开时,调用委托会抛出“System.NullReferenceException:Object reference not not set to object of object”.
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] 举报,一经查实,本站将立刻删除。