【发布时间】:2018-09-23 06:20:29
【问题描述】:
我正在使用 Roslyn 更改代码,但是,更改后会生成一个新的 SyntaxNode,但我无法找到执行此新代码的方法。我发现的唯一一个是从新的Root 中获取ToString 并使用新字符串调用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;
}
【问题讨论】: