【问题标题】:Delegate to expression tree(decompile)委托给表达式树(反编译)
【发布时间】:2013-11-22 21:36:59
【问题描述】:

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

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

【问题讨论】:

  • 你已经有了响应,只需要从Func返回它?
  • @bump no,在 func 中调用 api :D
  • "这是一个解决方案,但它基于 MONO。" - 这不应该阻止它对你正常工作。 Mono Cecil 也可以与微软自己的 .NET Framework 一起使用。
  • @hvd 单声道代码指的是单声道框架中的许多类。 :(
  • 你可以try这个...我不知道它处理了多少:nuget.org/packages/DelegateDecompiler - 但从好的方面来说,它可以直接从 NuGet 上运行。网;用法示例:github.com/hazzik/DelegateDecompiler

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


【解决方案1】:

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

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

另一个选择是使用 Roslyn 脚本。

【讨论】:

  • 谢谢,我有了新想法,直接跳转到webapi帮助详情页,不展示demo代码。
猜你喜欢
  • 2013-02-01
  • 2011-06-30
  • 1970-01-01
  • 1970-01-01
  • 2011-01-14
  • 2011-01-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多