函数获取任何方法的名称?

时间:2009-10-19 19:58:17

标签: c#

我想要一个名为 GetMethodName 的函数,以便以下代码打印“myMethod”:

int myMethod(string foo, double bar)
{
    // ...
}

Console.Out.WriteLine(GetMethodName(myMethod));

无论myMethod的方法签名是什么,这都应该有效。这可能吗?

6 个答案:

答案 0 :(得分:11)

不,这不可能。可以使用C#团队喜欢mythical infoof operator来包含,但还没有完成 - 但如果没有,你必须使用方法组转换,只有在您知道要使用的特定委托类型时才会有效。

你可能最接近的是使用表达式树:

public static string GetMethodName(Expression expression)
{
    // Code to take apart the expression tree and find the method invocation
}

GetMethodName(() => myMethod(0, 0));

实际上不需要调用 myMethod,但是你需要提供伪参数 - 如果有任何out / ref参数,这可能会令人恼火。

答案 1 :(得分:5)

正如在Eric Lippert's博客上指出的那样,您可以使用Action和Func委托来伪造它

public static MethodInfo GetInfo<T>(Action<T> action)
{
    return action.Method;
}
public static MethodInfo GetInfo<T, TResult>(Func<T, TResult> func)
{
    return func.Method;
}
public static MethodInfo GetInfo<T, U, TResult>(Func<T, U, TResult> func)
{
    return func.Method;
}   
public static int Target(int v1, int v2)
{
    return v1 ^ v2;
} 
static int Main(string[] args)
{
    var mi = GetInfo<string[], int>(Main);
    Console.WriteLine(mi.Name);

    var mi2 = GetInfo<int, int, int>(Target);
    Console.WriteLine(mi2.Name);
    return 0;
}

答案 2 :(得分:2)

这个怎么样?

public static string GetMethodName(Expression<Action> exp)
{
    var b = (MethodCallExpression)exp.Body;
    return b.Method.Name;
}

// ...


var name = GetMethodName(() => myMethod(string.Empty, 0.0));
System.Out.WriteLine(name);

答案 3 :(得分:-1)

如下所示?

new StackFrame(1,false).GetMethod()。Name

:编辑以添加代码示例...

    public string PrintMethodName()
    {
        return new StackFrame(1, false).GetMethod().Name;
    }

    private void Hi()
    {
        Console.WriteLine(PrintMethodName());
    }

答案 4 :(得分:-1)

编辑:误解了这个问题。它实际上有助于阅读问题。

您可以使用反射:

MethodBase.GetCurrentMethod返回当前运行的方法。

答案 5 :(得分:-2)

是的,这是可行的。查看类StackFrame及其GetMethod。

编辑:看起来我误解了原来的问题。别介意我原来的答案。