寻找一个C# => Linq表达式编译器

7
我正在寻找将整个方法转换为表达式树的能力。手写太麻烦了:)
因此(一个简单的例子),给定以下文本:
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#方法编译成表达式树。
4个回答

8
是的,Roslyn可以实现,但是Roslyn有自己的表达式树(称为语法树),Roslyn工具允许您加载和执行表达式或语句。
您需要编写自己的语法树遍历器将Roslyn语法树转换为您的表达式树,但是可能不是所有内容都能正确匹配。

我想Roslyn可以做到这一点。你知道有没有已经完成它的现有源吗?我正在寻找可用的东西。 - Shlomo
Roslyn 只发布了一个月,我认为需要一些时间,因为人们会编写和尝试它。但是你可以在 CodePlex 上找到使用 Irony 等的表达式编译器的东西。我认为过一段时间人们会在 CodePlex 上发布 Roslyn 项目,或者你可以开始一个并邀请人们贡献,然后从那里构建。 - Akash Kava

1

1
为什么不呢?
Expression<Func<int,int,int>> expr = (a,b) => a + b;

我将澄清我的问题。我想要一个函数,可以扫描上面方法的文本,并生成用于构造表达式树的文本或表达式树对象本身。 - Shlomo

0

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


恰恰相反 - 表达式树 在执行时生成的。当编译器看到一个目标类型为表达式树的 lambda 表达式时,它会发出 IL 以在执行时构建表达式树。您也可以编写 C# 代码来构建表达式树,如问题所示。 - Jon Skeet
我很抱歉,可能我表达的不够清楚。我的意思并不是排除实际的Expression或者lambda表达式,而是普通语句本身,比如说var a = 1 + 2;。这些语句在执行时并不是表达式树的形式。 - CassOnMars
但是Lambda表达式可以被转换为表达式树,使得在执行时抽象语法树被表示为一个表达式树。仍然不太清楚你的意思 - 我建议你编辑你的答案以澄清。 - Jon Skeet
我会的。我的措辞并不总是完美的。 - CassOnMars

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接