我想在SyntaxTree中重写“ MyMethod”的所有InvocationExpression,以添加文字参数0,并带有该参数>
private class Rewriter : CSharpSyntaxRewriter { public int Id { get; set; } public override SyntaxNode VisitInvocationExpression(InvocationExpressionSyntax node) { var invokName = node.Expression.ToString(); if (invokName == "MyMethod") { var argus = node.ArgumentList.AddArguments( SyntaxFactory.Argument(SyntaxFactory.LiteralExpression(SyntaxKind.NumericLiteralExpression, SyntaxFactory.Literal(Id)))); return node.Update((ExpressionSyntax)Visit(node.Expression), argus); } return node; } } static void Main(string[] args) { SyntaxTree oriTree = CSharpSyntaxTree.ParseText(@" public class MyClass { public string MyMethod(int id) { return $""{id}""; } public void Say() { var tmp = MyMethod();//worked var tmp1 = MyMethod();//worked var tmp2 = ""Hi "" + MyMethod();//worked Console.WriteLine($""Say {MyMethod()}"");//Not worked Console.WriteLine(""Hello "" + MyMethod());//Not worked } }"); var syntaxRoot = oriTree.GetCompilationUnitRoot(); var visitor = new Rewriter(); visitor.Id = 0; var changedSyntaxTree = visitor.Visit(syntaxRoot).SyntaxTree; }
但不是全部都被重写。
带
var methods = syntaxRoot.DescendantNodes().OfType<InvocationExpressionSyntax>().Where(o => o.Expression.ToString() == "MyMethod");
我可以枚举“ MyMethod”的所有
InvocationExpression
。但是我不知道如何在没有CSharpSyntaxRewriter的情况下更改语法树。
我该怎么办?谢谢。
我想在SyntaxTree中重写“ MyMethod”的所有InvocationExpression,以使用私有类Rewriter添加文字参数0:CSharpSyntaxRewriter {public int Id {get;组; } ...
根据CyrusNajmabadi的reply解决了>
您需要这样做: