5

これは、Reflection.Emit を使用する最初の試みです。提供されたオブジェクトのプロキシを動的に構築しています。プロキシは、パブリックプロパティへのアクセスを提供されたオブジェクトに渡します。私が受け取っているエラーは次のとおりです。

オブジェクト 'ProxyObject' のプロパティ アクセサー 'AccessorName' が次の例外をスローしました: メソッド 'ProxyObject.get_AccessorName()' によるメソッド 'NS.CoreObject.get_AccessorName() へのアクセスに失敗しました。

私が推測して収集できることから、これは、自動生成されたプロパティ ゲッター メソッドが非公開で非表示になっていることが原因であると考えられます。しかし、を使用してこれを回避するにはどうすればよいMethodBuilderですか?

Create DynamicMethod to assign value to a property?の投稿によると? 、DynamicMethod を使用して、メソッドをターゲット モジュールに「関連付ける」と宣言することでそれを行うことができますが、完全なクラスを構築する必要があります。Reflection.Emit を介して達成できる同等の「関連付け」はありますか?

これは私が実行しようとしている基本的な操作なので、私が気付いていない単純明快なものであると確信しています。

4

1 に答える 1

9

MethodBuilder場合: できません。アクセシビリティに関する通常の規則が適用されます。ただし、を介してごまかすことがDynamicMethodできます。これにより、(十分なアクセス権がある場合) 作成しているメソッドが実際には特定の型(または特定のモジュールなど) の静的メソッドであると偽ることができます。これは、プライベートな状態に自由にアクセスできることを意味します。次に例を示します。

using System;
using System.Reflection;
using System.Reflection.Emit;

public class Foo
{
    public Foo(int bar)
    {
        Bar = bar;
    }
    private int Bar { get; set; }
}
static class Program {
    static void Main()
    {
        var method = new DynamicMethod("cheat", typeof(int),
            new[] { typeof(object) }, typeof(Foo), true);
        var il = method.GetILGenerator();
        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Castclass, typeof(Foo));
        il.Emit(OpCodes.Callvirt, typeof(Foo).GetProperty("Bar",
            BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic
            ).GetGetMethod(true));
        il.Emit(OpCodes.Ret);
        var func = (Func<object, int>)method.CreateDelegate(
            typeof(Func<object, int>));

        var obj = new Foo(123);
        Console.WriteLine(func(obj));
    }
}

プロパティの値のみを取得する場合はDelegate.CreateDelegate、getter メソッドを介して同じことを自動的に行うことができることにも注意してください。

var method = typeof(Foo).GetProperty("Bar",
    BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic)
    .GetGetMethod(true);
var func = (Func<Foo, int>)
    Delegate.CreateDelegate(typeof(Func<Foo, int>), method);
于 2012-12-21T13:29:19.577 に答える