【问题标题】:C# anonymous function log method bodyC#匿名函数日志方法体
【发布时间】:2021-05-31 17:29:59
【问题描述】:

我正在开发一个应用程序,我们需要记录匿名 (lambda) 函数的整个语句。

这意味着“LogAction”方法应该记录所有作为动作传递的语句。

        protected void LogAction(Action action)
        {
            /*
                Log the statement(s) passed to this method i.e. should print
                    var a = 10;
                    var b = 20;
                    Console.WriteLine($"Sum  of {a} and {b} is {a+b}");
            */
        }
        LogAction(() =>
        {
            var a = 10;
            var b = 20;
            Console.WriteLine($"Sum  of {a} and {b} is {a+b}");
        });

【问题讨论】:

  • 将应用程序逻辑暴露给外部。不是最好的想法。这是为了调试目的吗?
  • 是的,仅用于调试目的。
  • 再想一想:如果它们是匿名的,并且您确实遇到了反复出现的问题,为什么不让它们匿名并编写单元测试?
  • 请考虑编译器可能会将您的示例优化为Console.WriteLine($"Sum of 10 and 20 is 30");
  • ^^ 它在 Debug 和 Release 中可能会有所不同。

标签: c# lambda anonymous-methods


【解决方案1】:

您可以在 C# 中使用 Expression 类:

Expression<Action> ex = () => System.Console.WriteLine("Hello world");

Console.WriteLine(ex.ToString());

上面的代码将在控制台上打印() =&gt; WriteLine("Hello world")。这对于调试目的应该有足够的帮助。不幸的是,它没有提供人们期望的那么大的灵活性。例如下面的初始化会给你一个错误:

//ERROR: A lambda expression with a statement body cannot be converted to an expression tree
Expression<Action> ex = () => 
            {
                int a = 10;
                int b = 21;
                Console.WriteLine(a + b);
            };

解决此问题的一种方法是定义一个方法,您可以稍后将其分配给 Expression 对象:

void Sum()
        {
            int a = 10;
            int b = 21;
            Console.WriteLine(a + b);
        }

有效分配:

Expression<Action> ex = () => Sum();
Console.WriteLine(ex.ToString());

上面的代码在控制台上打印() =&gt; Sum()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多