Func的身体

问题描述 投票:6回答:1

如何从功能中获取身体

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

编辑:有关此主题的更多信息,请参见:Expression Trees

c# expression-trees func
1个回答
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.
© www.soinside.com 2019 - 2024. All rights reserved.