Reflection.Emit
その場でプロパティのゲッターを生成するために使用しています。これまでのところ、私のコードは、プロパティが公開されていない場合、またはプライベート アクセサーで公開されている場合を除いて、テストしたすべてのケースで機能します。PropertyInfo は、GetProperties の結果を反復することによって渡されます。プロパティが公開されていない場合、delegate
スローを呼び出す
"System.NullReferenceException : Object reference not set to an instance of an object."
このコードを使用して生成しています: ( property
is a PropertyInfo
)
// 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>));