在匿名方法中使用MethodInfo.GetCurrentMethod()

HuB*_*eZa 7 .net c# reflection anonymous-methods

public static void Main(string[] args)
{
    Action a = () => Console.WriteLine(MethodInfo.GetCurrentMethod().Name);
    a();
}
Run Code Online (Sandbox Code Playgroud)

这段代码将返回一个不起眼的字符串,如下所示:<Main>b__0.

有没有办法忽略匿名方法并获得更易读的方法名称?

Dar*_*rov 6

不,没有.这就是为什么它是一种匿名方法.该名称由编译器自动生成,并保证是唯一的.如果要获取调用方法名称,可以将其作为参数传递:

public static void Main()
{
    Action<string> a = name => Console.WriteLine(name);
    a(MethodInfo.GetCurrentMethod().Name);
}
Run Code Online (Sandbox Code Playgroud)

或者如果你真的想要一个有意义的名字,你需要提供它:

public static void Main()
{
    Action a = MeaningfullyNamedMethod;
    a();
}

static void MeaningfullyNamedMethod()
{
    Console.WriteLine(MethodInfo.GetCurrentMethod().Name);
}
Run Code Online (Sandbox Code Playgroud)

  • @HuBeZa,您可以测试MethodInfo是否使用`[CompilerGenerated]`属性进行修饰.这是一个必需的条件,并且是一个好的候选者,因为它是一个匿名方法,但显然不是充分条件:`var isCompilerGenerated = MethodInfo.GetCurrentMethod().IsDefined(typeof(CompilerGeneratedAttribute),true);` (2认同)

Mar*_*ell 6

你可以在外面捕获它:

var name = MethodInfo.GetCurrentMethod().Name + ":subname";
Action a = () => Console.WriteLine(name);
Run Code Online (Sandbox Code Playgroud)

除此之外; 没有.