1

私はこのコードを持っています:

class Program
{
    static void Main(string[] args)
    {
        Action whatToDo = () => {
            var member = (MemberInfo)(MethodBase.GetCurrentMethod());
            Thread.Sleep(0); //whatever, need something to put a breakpoint on
        };
        whatToDo();
    }
}

それを実行し、watch を使用してmember参照にバインドされたオブジェクトの内部を調べると、MemberInfo.Nameプロパティに value があることがわかります<Main>b__0

これは奇妙に見えます。whatToDoリフレクションで名前を使用しないのはなぜですか? 1 つのメンバー関数内に同じ署名を持つ複数のアクションがある場合、どのアクションが報告されているかをどのように確認できますか?

リフレクションによってこのような奇妙な名前が返されるのはなぜですか?

4

1 に答える 1

9

デリゲートに変換されるラムダ式は、メソッドに変換されます。あなたのコードは以下と同等です:

class Program
{
    static void Main(string[] args)
    {
        Action whatToDo = MyLambda; // Method group conversion
        whatToDo();
    }

    static void MyLambda()
    {
        var member = (MemberInfo)(MethodBase.GetCurrentMethod());
        Thread.Sleep(0); //whatever, need something to put a breakpoint on
    }
}

...コンパイラは、キャプチャされた変数などに必要な新しいクラスを作成するのに十分なほどスマートであることを除いて.私の変換では、余分なメソッドが呼び出さますMyLambda.それらに直接アクセスできないなど)。

于 2012-05-04T13:59:52.907 に答える