6

我怎样才能从函数中得到一个身体

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);
}

编辑:有关此主题的更多信息,请参阅:表达式树

4

1 回答 1

11

你不能。AFunc<T>不是你可以轻易分析的东西。如果要分析 lambda,则需要创建Expression<Func<bool>>并分析它。

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

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

body将是MethodCallExpression您可以进一步分析或仅通过ToString. 使用ToString不会完全产生您想要的结果,但它也包含该信息。

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

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

如您所见,"output.SendToFile()"是否存在。

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

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

可以缩短为:

methodCall.Compile()(); // looks strange but is valid.
于 2013-07-16T10:15:54.243 回答