如何从功能中获取身体
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
你不能。您无法轻松分析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.