-2

数学名を文字列に入れたいのですが、ハードコードされた値も使用したくありません。代わりに、リフレクションによって動的に名前を取得したいと思います。次の作業ステートメントを使用しました。

"The method is called " + new Action(MyMethod).Method.Name;

Actionデリゲートを作成することは意味的に不適切だと思います。メソッド呼び出しがあることを示唆していますが、代わりにリフレクションがあります。クラスのtypeof演算子またはGetTypeのようなものを探していますが、メソッドレベルです。

パターンは、Delegate.Method.Name私の目標を達成するための最善かつ標準的なアプローチとして機能していますか?


私は現在の方法ではないことを意味しました。

4

4 に答える 4

1

MethodBase.GetCurrentMethod() を使用する

于 2013-08-14T11:51:23.527 に答える
0

現在、最善の解決策:

  1. 静的クラスを作成しますReflectionExtensionMethods:

    public static class ReflectionExtensionMethods
    
  2. ActionAction<T>などFunc<T>のいくつかのメソッドを追加しますFunc<T1, T2>。 の例を次に示しますAction

    public static string GetMethodName(this Type @this, Expression<Action> expression)
    {
        return GetMethodNameInternal(@this, expression);
    }
    
  3. 指定された式とその本体が有効かどうかをチェックする内部部分:

    private static string GetMethodNameInternal(Type @this, MethodCallExpression bodyExpression)
    {
        if (bodyExpression == null)
            throw new ArgumentException("Body of the exspression should be of type " + typeof(MethodCallExpression).Name);
    
        var member = bodyExpression.Method;
        if (member.MemberType != MemberTypes.Method)
            throw new ArgumentException("MemberType of the exspression should be of type " + MemberTypes.Method);
    
        if (!object.Equals(@this, member.DeclaringType))
            throw new ArgumentException("Invalid property owner.");
    
        return member.Name;
    }
    
  4. インスタンスメンバーの使用法:

    var owner = new Foo();
    var methodName = typeof(Foo).GetMethodName(() => owner.VoidMethod());
    
  5. 静的メンバーの使用法:

    var methodName = typeof(Foo).GetMethodName(() => Foo.StaticVoidMethod());
    

ReflectionExtensionMethodsプロパティやその他のメンバーの名前を返すメソッドによってさらに補完される場合があります。

于 2013-08-19T07:51:26.380 に答える