繁体   English   中英

来自 Func 的身体<T>

[英]Body from Func<T>

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

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

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

你不能。 Func<T>不是您可以轻松分析的东西。 如果你想分析一个 lambda,你需要创建一个Expression<Func<bool>>并分析它。

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

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

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

例如,在 LINQPad 中对body执行ToString()导致如下结果:

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

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

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

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

可以缩短为:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM