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

时间:2012-07-21 05:03:34

标签: c#

我正在使用Reflection.Emit动态生成字段的getter。到目前为止,我的代码适用于我测试的所有情况,除非该字段不公开。当字段不公开时,调用委托会抛出“System.NullReferenceException:对象引用未设置为对象的实例。”

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

答案 0 :(得分:1)

您是否使用正确的参数进行呼叫?对于私有字段,您需要指定BindingFlags.NonPublic,如:

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

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

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