Возможно ли в настоящее время перевести код C # в абстрактное синтаксическое дерево?
Да, тривиально в особых обстоятельствах (= с использованием новой платформы выражений ):
// Requires 'using System.Linq.Expressions;'
Expression<Func<int, int>> f = x => x * 2;
Это создает дерево выражений для лямбда-выражения, то есть функцию, принимающую int
и возвращающую double. Вы можете изменить дерево выражений, используя каркас Expressions (= классы из этого пространства имен), а затем скомпилировать его во время выполнения:
var newBody = Expression.Add(f.Body, Expression.Constant(1));
f = Expression.Lambda<Func<int, int>>(newBody, f.Parameters);
var compiled = f.Compile();
Console.WriteLine(compiled(5)); // Result: 11
Обратите внимание, что все выражения являются неизменяемыми, поэтому их необходимо создавать заново по композиции. В этом случае я добавил 1: 1014 *.
Обратите внимание, что эти деревья выражений работают только с реальными выражениями, то есть с контентом, найденным в функции C #. Таким образом, вы не можете получить синтаксические деревья для более высоких конструкций, таких как классы. Используйте платформу CodeDom для них.