来自 Func 的主体

2024-04-15

我怎样才能从函数中获得身体

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

编辑: 有关此主题的更多信息,请参阅:表达式树 http://msdn.microsoft.com/en-us/library/bb397951.aspx


你不能。 AFunc<T>没有什么可以轻易分析的。如果你想分析 lambda,你需要创建一个Expression<Func<bool>>并对其进行分析。

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

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

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

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

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

如你看到的,"output.SendToFile()"有没有。

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

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

可以简化为:

methodCall.Compile()(); // looks strange but is valid.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 Func 的主体 的相关文章

随机推荐