首页 > 解决方案 > 命名通用动作/方法

问题描述

使用这样的代码示例:

    public static void Main(string[] args)
    {
        Action action = () =>
        {
            var x = 1;
            x++;
        };

        Console.WriteLine(action.Method.Name);
    }

将输出:<Main>b__0_0

是否可以为这个动作命名,以便在更复杂的解决方案中更直观地使用它。例如能够产生更好的异常或堆栈跟踪。

标签: c#

解决方案


根据定义,lambda 表达式被编译为匿名方法。当然,这有点用词不当。该方法确实有一个名称,但是这个名称是由编译器分配的,就其余的编译代码而言,该方法根本没有名称。所以,不……你不能改变名字。

但是,如果您使用 C# 7 或更高版本,则可以访问命名的本地函数。这样的函数仍然可以捕获局部变量,并且在其他方​​面表现得非常像匿名方法。在您的示例中,这可能如下所示:

public static void Main(string[] args)
{
    void M()
    {
        var x = 1;
        x++;
    };
     
    Action action = M;

    Console.WriteLine(action.Method.Name);
}

然后,您可以提供您想要的任何有意义的名称(大概比M:) 更有意义的名称),这将显示在MethodInfo委托的对象中。


推荐阅读