如何从函数中获取正文
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);
}
答案 0 :(得分: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.