c# - 命名通用动作/方法
问题描述
使用这样的代码示例:
public static void Main(string[] args)
{
Action action = () =>
{
var x = 1;
x++;
};
Console.WriteLine(action.Method.Name);
}
将输出:<Main>b__0_0
是否可以为这个动作命名,以便在更复杂的解决方案中更直观地使用它。例如能够产生更好的异常或堆栈跟踪。
解决方案
根据定义,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
委托的对象中。
推荐阅读
- reactjs - 为什么 setState 在这种情况下在 NextJS 中不起作用?
- css - 如何告诉 CSS :not() 选择器影响所有子节点?
- url-rewriting - TYPO3 v9 上具有 StaticMappableAspectInterface 的自定义路由方面未执行
- google-cloud-functions - 仅允许内部流量用于云端点后面的云功能
- c++ - 接收Base64字符串并将其转换为jpg图像
- javascript - 如何解决使用 Httrack 下载站点的问题
- flutter - 列表小部件的颤振高度没有减少
- javascript - 调整大小后 SVG 多边形位置错误
- java - 如何在其他类中使用公共常量?
- sql - 总结所有日期,但只保留最后一个日期