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
    );

有任何想法吗?有没有人可能对罗斯林做过一些可以做到这一点的事情?

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

4

4 回答 4

8

Yes Roslyn can do, but Roslyn has its own expression tree (they are called syntax trees), Roslyn tools allow you to load and execute expressions or statements.

You will have to write your own syntax tree walker to convert Roslyn syntax tree to your expression tree, but everything may not fit correctly.

于 2011-11-15T18:49:52.753 回答
1

请参阅 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 不能(例如,类型定义或一些涉及引用的表达式)。

于 2011-11-17T23:48:25.760 回答
1

为什么不:

Expression<Func<int,int,int>> expr = (a,b) => a + b;
于 2011-11-15T18:42:50.147 回答
0

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

于 2011-11-15T18:41:24.347 回答