5

Reflection.Emitを使用して、フィールドのゲッターをオンザフライで生成しています。これまでのところ、フィールドが公開されていない場合を除いて、テストしたすべてのケースでコードが機能します。フィールドが公開されていない場合、デリゲートを呼び出すと、「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>));
4

1 に答える 1

2

適切なパラメータで呼び出していますか?プライベートフィールドの場合、次のようにBindingFlags.NonPublicを指定する必要があります。

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

また

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

例外をスローするプログラムの完全な例を投稿できますか?

于 2012-07-21T06:13:38.540 に答える