来自Func <T>的身体

Ser*_*gey 6 c# func expression-trees

我如何从功能中获取身体

Func<bool> methodCall = () => output.SendToFile(); 

if (methodCall())
    Console.WriteLine("Success!");
Run Code Online (Sandbox Code Playgroud)

我需要将此"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);
}
Run Code Online (Sandbox Code Playgroud)

Dan*_*rth 9

你不能.A Func<T>是你无法轻易分析的.如果要分析lambda,则需要创建Expression<Func<bool>>并分析它.

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

Expression<Func<bool>> methodCall = () => output.SendToFile(); 
var body = methodCall.Body;
Run Code Online (Sandbox Code Playgroud)

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

例如,在执行ToString()body的LINQPad导致这样的事情:

value(UserQuery+<>c__DisplayClass0).output.SendToFile()
Run Code Online (Sandbox Code Playgroud)

如你所见,"output.SendToFile()"是吗?

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

var func = methodCall.Compile();
func();
Run Code Online (Sandbox Code Playgroud)

可以缩短到这个:

methodCall.Compile()(); // looks strange but is valid.
Run Code Online (Sandbox Code Playgroud)

  • 但请注意,表达式不能包含语句. (5认同)