我想要一个名为 GetMethodName 的函数,以便以下代码打印“myMethod”:
int myMethod(string foo, double bar)
{
// ...
}
Console.Out.WriteLine(GetMethodName(myMethod));
无论myMethod的方法签名是什么,这都应该有效。这可能吗?
答案 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)
答案 5 :(得分:-2)
是的,这是可行的。查看类StackFrame及其GetMethod。
编辑:看起来我误解了原来的问题。别介意我原来的答案。