委托表达式树(反编译)

时间:2013-11-22 07:25:31

标签: c# converter expression-trees anonymous-function

我遇到了一个奇怪的要求:

有一个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/

1 个答案:

答案 0 :(得分:1)

基本上,你要求的是不可能的,因为将C#编译为IL并不是无损操作。我认为最好的选择是分发C#代码本身(可能是.cs文件资源,或类似的东西)。

那样,你直接拥有文字。要在运行时编译它,您可以使用CodeDOM。这将创建一个程序集,您将加载该程序集,然后使用反射调用您的方法。

执行此操作的另一个选择是使用Roslyn Scripting。