【问题标题】:Looking for a C# => Linq Expression compiler寻找 C# => Linq 表达式编译器
【发布时间】:2011-11-15 18:37:09
【问题描述】:

我正在寻找将整个方法转换为表达式树的能力。写出来会很烂。 :)

所以(简单的例子)给出以下文本:

public static int Add(int a, int b)
{
   return a + b;
}

我想获得一个代表这个的内存对象,或者下面的文本:

ParameterExpression a = Expression.Parameter(typeof(int), "a");
ParameterExpression b = Expression.Parameter(typeof(int), "b");
var expectedExpression = Expression.Lambda<Func<int, int, int>>(
        Expression.Add(a,b),
        a,
        b
    );

有什么想法吗?有没有人对 Roslyn 做过可以做到这一点的事情?

编辑:澄清:我想将任何 C# 方法(例如,上面的方法)作为文本吸收,并生成一个结果表达式。基本上,我希望将任何给定的 C# 方法编译成表达式树。

【问题讨论】:

    标签: c# expression-trees roslyn


    【解决方案1】:

    是的,Roslyn 可以,但是 Roslyn 有自己的表达式树(它们被称为语法树),Roslyn 工具允许您加载和执行表达式或语句。

    您必须编写自己的语法树遍历器才能将 Roslyn 语法树转换为您的表达式树,但一切都可能不正确。

    【讨论】:

    • 我认为罗斯林可以做到。你知道任何现有的来源已经做到了吗?我正在寻找可用的东西。
    • Roslyn 只发布了一个月,我认为这需要一些时间,因为人们会编写和尝试它。但是您可能会在代码 plex 上使用讽刺等进行表达式编译器。我认为有时人们会在 Roslyn 的代码 plex 上发布项目,或者您可以启动一个项目并要求人们做出贡献,它将从那里开始构建。
    【解决方案2】:

    为什么不:

    Expression<Func<int,int,int>> expr = (a,b) => a + b;
    

    【讨论】:

    • 我会澄清我的问题。我想要一个函数,它可以扫描上述方法的文本,并生成文本以构造表达式树,或者生成表达式树对象本身。
    【解决方案3】:

    请参阅 billchi_ms 答案:http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/e6364fec-29c5-4f1d-95ce-796feb25a8a9

    简短的回答是我们可以提供,或者有人可以为 ET v2 编写 Roslyn 树,但是 Roslyn 树可以表示 VB 和 C# 的完整语言,而 ET v2 不能(例如,类型定义或一些涉及的引用表达式)。

    【讨论】:

      【解决方案4】:

      表达式树本身不是在运行时从Expressions 或 lambdas 以外的任何东西生成的(这意味着您的第一个添加语句无法从您的可执行文件中作为表达式树检索)。但是,您可以在 C# 代码(不是可执行文件)上使用代码 DOM,并构建从 DOM 到表达式树的转换器。

      【讨论】:

      • 完全相反——表达式树是在执行时生成的。当编译器看到具有表达式树目标类型的 lambda 表达式时,它会发出 IL 以在执行时构建表达式树。您也可以编写 C# 代码来构建表达式树,如问题所示。
      • 我很抱歉,因为我可能错误地表达了我想要传达的内容。我不排除实际的 Expressions 或 lambda,而只是常规语句本身,例如说 var a = 1 + 2;。此类语句在执行时不是表达式树的形式。
      • 但是 lambda 表达式可以转换为表达式树,这样抽象语法树在执行时由表达式树表示。仍然不太清楚你的意思 - 我建议你编辑你的答案来澄清。
      • 我会的。我并不总是用词完美。
      猜你喜欢
      • 2010-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-11
      • 1970-01-01
      • 2011-08-28
      • 2010-09-18
      相关资源
      最近更新 更多