Ищите компилятор выражений C # => Linq - PullRequest
7 голосов
/ 15 ноября 2011

Я ищу возможность конвертировать целые методы в деревья выражений. Выписать это было бы отстой. :)

Итак (тривиальный пример) приведен следующий текст:

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 ]

8 голосов
/ 15 ноября 2011

Да, может делать Roslyn, но Roslyn имеет свое собственное дерево выражений (они называются деревьями синтаксиса), инструменты Roslyn позволяют загружать и выполнять выражения или операторы.

Вам придется написать свой собственный обходчик синтаксического дерева, чтобы преобразовать синтаксическое дерево Roslyn в дерево выражений, но все может не подходить правильно.

1 голос
/ 18 ноября 2011

См. Ответ billchi_ms по адресу: http://social.msdn.microsoft.com/Forums/en-US/roslyn/thread/e6364fec-29c5-4f1d-95ce-796feb25a8a9

Краткий ответ: мы можем предоставить или кто-то может написать дерево Рослина в ET v2, но деревья Рослина могут представлять полные языки VBи C #, в то время как ETs v2 не могут (например, определения типов или некоторые ссылки, связанные с ref).

1 голос
/ 15 ноября 2011

Почему бы и нет:

Expression<Func<int,int,int>> expr = (a,b) => a + b;
0 голосов
/ 15 ноября 2011

Сами деревья выражений не генерируются во время выполнения из чего-либо, кроме Expression s или лямбда-выражений (то есть ваш первый оператор сложения не может быть получен из вашего исполняемого файла в виде дерева выражений). Однако вы можете использовать код DOM в коде C # (не в исполняемом файле) и построить транслятор из DOM в дерево выражений.

...