正在寻找C#=>;Linq表达式编译器

正在寻找C#=>;Linq表达式编译器,c#,expression-trees,roslyn,C#,Expression Trees,Roslyn,我正在寻找将整个方法转换为表达式树的能力。写出来会很糟糕。:) 因此(简单示例)给出以下文本: 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 expectedExpr

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

因此(简单示例)给出以下文本:

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
    );
我希望获取表示此内容的内存中对象,或者获取以下文本:

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
    );
ParameterExpression a=Expression.Parameter(typeof(int),“a”);
ParameterExpression b=表达式参数(typeof(int),“b”);
var expectedExpression=Expression.Lambda(
表达式。添加(a,b),
A.
B
);
有什么想法吗?也许有人对Roslyn做过什么可以做到这一点的事吗


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

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

为什么不:

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

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

您必须编写自己的语法树walker,才能将Roslyn语法树转换为表达式树,但所有内容可能都不正确。

请参阅billchi女士的答案:


简而言之,我们可能会提供,或者有人可能会将Roslyn树写入ET v2,但是Roslyn树可以表示VB和C的完整语言,而ETs v2不能(例如,类型定义或某些涉及引用的表达式)。

相反,表达式树是在执行时生成的。当编译器看到目标类型为表达式树的lambda表达式时,它会在执行时发出IL来构建表达式树。您也可以编写C#代码来构建表达式树,如问题所示。我很抱歉,因为我可能误解了我的意图。我不排除实际的
表达式
s或lambda,只排除正则语句本身,比如说
var a=1+2。这样的语句在执行时不是以表达式树的形式出现的。但是lambda表达式可以转换为表达式树,这样抽象语法树在执行时由表达式树表示。现在还不太清楚你的意思-我建议你编辑你的答案来澄清。我会的。我的语言并不总是完美的。我会澄清我的问题。我想要一个函数,可以扫描上面方法的文本,生成文本来构建表达式树,或者生成表达式树对象本身。我想Roslyn可以做到这一点。你知道有任何现有的来源已经这样做了吗?我正在寻找一些可用的东西。Roslyn只出来一个月,我想这需要一些时间,因为人们会用它来写作和实验。但你可能会在CodePlex上使用反讽之类的东西,比如表达式编译器。我想在某个时候,人们会在CodePlex上发布Roslyn的项目,或者你可以开始一个项目,请人们贡献自己的力量,然后从那里开始构建。