Я изменяю код с помощью Roslyn, однако после изменения генерируется новый SyntaxNode
, но я не могу найти способ выполнить этот новый код.Единственное, что я нашел, это получить ToString
из нового Root
и вызвать EvaluateAsync
с новой строкой.Должен быть способ превзойти это, поскольку у меня уже есть новый скомпилированный код.
static void Main(string[] args)
{
var expression = "System.Console.WriteLine(\"Test\")";
var compile = CSharpScript.Create<EntityRepresentation>(expression).GetCompilation();
var root = compile.SyntaxTrees.Single().GetRoot();
var descentands = root.DescendantNodes().Where(n =>
{
if (n is ArgumentSyntax)
return true;
return false;
}).ToList();
var otherRoot = root.ReplaceNodes(descentands, (n1, n2) =>
{
var argumentName = Argument(LiteralExpression(SyntaxKind.StringLiteralExpression, Literal("NewValue")));
return argumentName;
});
var newCode = otherRoot.ToString();
// Faz o que estou querendo, contudo não me parece a melhor maneira
var result = CSharpScript.EvaluateAsync(newCode).Result;
}