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)
你不能.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)