Reflection.Emit私有财产访问

时间:2012-07-21 07:22:40

标签: c#

我正在使用Reflection.Emit动态生成属性的getter。到目前为止,我的代码适用于我测试过的所有情况,除非该属性不是公共的,或者是公共的私有访问者。通过迭代GetProperties的结果传入PropertyInfo。当该属性不公开时,调用delegate抛出

"System.NullReferenceException : Object reference not set to an instance of an object."

我正在使用此代码生成:(propertyPropertyInfo

// Get setter or return null
MethodInfo setMethod = property.GetSetMethod ();
if (setMethod == null)
    return null;

// Method names follow the pattern: "_Set<Property>_"
DynamicMethod dm = new DynamicMethod(String.Concat ("_Set", property.Name, "_"), typeof(void),
                                     new Type[] { typeof(object), typeof(object) },
                                             property.DeclaringType, true);
ILGenerator generator = dm.GetILGenerator ();
generator.Emit (OpCodes.Ldarg_0);
generator.Emit (OpCodes.Castclass, property.DeclaringType);
generator.Emit (OpCodes.Ldarg_1);

if (property.PropertyType.IsClass)
    generator.Emit (OpCodes.Castclass, property.PropertyType);
else
    generator.Emit (OpCodes.Unbox_Any, property.PropertyType);

generator.EmitCall (OpCodes.Callvirt, setMethod, null);
generator.Emit (OpCodes.Ret);

return (Action<object, object>)dm.CreateDelegate (typeof(Action<object, object>));

0 个答案:

没有答案