我遇到了一个奇怪的要求:
有一个api列表,我必须为每个api编写一个示例,并且该示例必须存在于用户,因此它提醒我“表达式树”,方法可以存储和执行。
但问题是,该方法将被编译......
当我调试表达式时,我得到了IL代码。
我需要的是:
Func<HttpResponseMessage> func = () =>
{
// do something and call api
// ...
// return the response from api
}
Expression<Func<HttpResponseMessage> expression = SomeMethod(func);
Console.WriteLine(expression.ToString()); // get the func body(NOT COMPILED)
expression.Body.Compile().Invoke(); // compile expression and invoke the func.
这是一个解决方案,但它以MONO为基础 http://evain.net/blog/articles/2009/04/22/converting-delegates-to-expression-trees/
答案 0 :(得分:1)
基本上,你要求的是不可能的,因为将C#编译为IL并不是无损操作。我认为最好的选择是分发C#代码本身(可能是.cs文件资源,或类似的东西)。
那样,你直接拥有文字。要在运行时编译它,您可以使用CodeDOM。这将创建一个程序集,您将加载该程序集,然后使用反射调用您的方法。
执行此操作的另一个选择是使用Roslyn Scripting。