0

Action.Methodが使用できないWinRTのアクションからメソッド名を取得しようとしています。これまでのところ私はこれを持っています:

public class Test2
{
    public static Action<int> TestDelegate { get; set; }

    private static string GetMethodName(Expression<Action<int>> e)
    {
        Debug.WriteLine("e.Body.NodeType is {0}", e.Body.NodeType);
        MethodCallExpression mce = e.Body as MethodCallExpression;
        if (mce != null)
        {
            return mce.Method.Name;
        }
        return "ERROR";
    }

    public static void PrintInt(int x)
    {
        Debug.WriteLine("int {0}", x);
    }

    public static void TestGetMethodName()
    {
        TestDelegate = PrintInt;
        Debug.WriteLine("PrintInt method name is {0}", GetMethodName(x => PrintInt(x)));
        Debug.WriteLine("TestDelegate method name is {0}", GetMethodName(x => TestDelegate(x)));
    }
}

TestGetMethodName()を呼び出すと、次の出力が得られます。

e.Body.NodeType is Call
PrintInt method name is PrintInt
e.Body.NodeType is Invoke
TestDelegate method name is ERROR

目標は、TestDelegateに割り当てられているメソッドの名前を取得することです。「GetMethodName(x => PrintInt(x))」呼び出しは、私が少なくとも部分的に正しく実行していることを証明するためだけにあります。「TestDelegateメソッド名はPrintIntです」とどのように通知できますか?

4

2 に答える 2

3

答えは私が作ったよりもずっと簡単です。それは単にTestDelegate.GetMethodInfo()。Nameです。GetMethodName関数は必要ありません。私は「System.Reflectionを使用していない」ため、Delegate.GetMethodInfoがインテリセンスで表示されておらず、ドキュメントでそれを見逃していました。ギャップを埋めてくれたHappyNomadに感謝します。

動作するコードは次のとおりです。

public class Test2
{
    public static Action<int> TestDelegate { get; set; }

    public static void PrintInt(int x)
    {
        Debug.WriteLine("int {0}", x);
    }

    public static void TestGetMethodName()
    {
        TestDelegate = PrintInt;
        Debug.WriteLine("TestDelegate method name is {0}", TestDelegate.GetMethodInfo().Name);
    }
}
于 2013-03-26T22:44:33.703 に答える
1
private static string GetMethodName( Expression<Action<int>> e )
{
    Debug.WriteLine( "e.Body.NodeType is {0}", e.Body.NodeType );
    MethodCallExpression mce = e.Body as MethodCallExpression;
    if ( mce != null ) {
        return mce.Method.Name;
    }

    InvocationExpression ie = e.Body as InvocationExpression;
    if ( ie != null ) {
        var me = ie.Expression as MemberExpression;
        if ( me != null ) {
            var prop = me.Member as PropertyInfo;
            if ( prop != null ) {
                var v = prop.GetValue( null ) as Delegate;
                return v.Method.Name;
            }
        }
    }
    return "ERROR";
}
于 2013-03-26T22:12:42.633 に答える