来自Func <t> </t>的身体

时间:2013-07-16 10:14:14

标签: c# func

如何从函数中获取正文

 Func<bool> methodCall = () => output.SendToFile(); 
      if (methodCall())
         Console.WriteLine("Success!");

我需要将“output.SendToFile()”作为字符串

另一个例子

string log = "";
    public void Foo<T>(Func<T> func)
    {
        try
        {
            var t = func();

        }
        catch (Exception)
        {
            //here I need to add the body of the lambda
            // log += func.body;
        }
    }

public void Test()
        {
            var a = 5;
            var b = 6;
            Foo(() => a > b);
        }

1 个答案:

答案 0 :(得分:9)

你做不到。 Func<T>是您无法轻易分析的。如果要分析lambda,则需要创建Expression<Func<bool>>并进行分析。

获取表达式的主体很简单:

Expression<Func<bool>> methodCall = () => output.SendToFile(); 
var body = methodCall.Body;

body将是MethodCallExpression您可以进一步分析或仅通过ToString输出。使用ToString并不会完全符合您的想法,但它也包含这些信息。

例如,在LINQPad中对ToString()执行body会产生如下结果:

value(UserQuery+<>c__DisplayClass0).output.SendToFile()

如您所见,"output.SendToFile()"就在那里。

要实际执行表达式定义的代码,首先需要编译它:

var func = methodCall.Compile();
func();

可以缩短到这一点:

methodCall.Compile()(); // looks strange but is valid.