2

私はかなり単純なことをしようとしていますが、単に自分のクラスのダミー インスタンスを作成する方法があるかどうかはわかりません。

簡単なコードを使用して、非静的メソッドのメソッド名を簡単に取得しようとしています:

static string GetMethodName(Func<string, int> function  )
        {
            return function.Method.Name;
        }

しかし、私は MyStaticMethod からこれを呼び出そうとしていますが、もちろんそれは不平を言っています:

private static void MyStaticMethod()
{
   var a = GetMethodName(MyNonStaticMethod);
}


private int MyNonStaticMethod(string param1)
{
  return 0;
}

含まれているクラスのダミーインスタンスを作成せずにこれを達成する方法はありますか? 明らかに私のケースはより複雑であり、単純に非静的メソッドを静的にすることはできません (インスタンスが必要であり、依存バインディングがあります)。必要なのは名前だけなので、これが可能かどうか疑問に思っています(実際にはインスタンスは必要ありません)。私は魔法の文字列から離れようとしており、物事が変化したときにコンパイル時のエラーが発生したいと考えています。

編集: 静的ヘルパー クラスを作成しました

私は一般的な方法を持っています:

    public static string GetMemberName<T>(
                Expression<Func<T, object>> expression)
            {
                if (expression == null)
                {
                    throw new ArgumentNullException("expression");
                }

                return _GetMemberName(expression.Body);
            }

private static string _GetMemberName(
            Expression expression)
        {   
            if (expression is MemberExpression)
            {
                var memberExpression =
                    (MemberExpression)expression;
                return memberExpression.Member.Name;
            }

            if (expression is MethodCallExpression)
            {
                var methodCallExpression = (MethodCallExpression)expression;
                return methodCallExpression.Method.Name;
            }

            if (expression is UnaryExpression)
            {
                var unaryExpression = (UnaryExpression)expression;
                return GetMemberName(unaryExpression);
            }

            throw new ArgumentException("Unrecognized expression");
        }
4

1 に答える 1

2

もちろん、これを行うことができます。Expression<Func<YourInstanceClass, TReturn>>次のように使用します。

static string GetMethodName<TReturn>(Expression<Func<YourInstanceClass, TReturn>> function)
{
    var call = function.Body as MethodCallExpression;
    return call != null ? call.Method.Name : "not a single call expression";
}

今、あなたはすることができます

var name = GetMethodName(a => a.MyNonStaticMethod("1"));

Console.WriteLine (name); //prints MyNonStaticMethod

どこ

public class YourInstanceClass
{
    public int MyNonStaticMethod(string param1)
    {
        return 0;
    }
}

MyNonStaticMethod外部で呼び出すことができるようにパブリックにしましたが、プライベートのままにして、クラス内の静的メソッドで呼び出すことができます

于 2013-04-02T21:38:33.663 に答える