使用Roslyn修改方法主体

bli*_*aro 3 c# syntax roslyn

有没有办法用Roslyn在.cs文件中的方法末尾添加特定的语句?

var code = new StreamReader(@"C:\Users\PersonalUser\Documents\Visual Studio 2015\Projects\SampleToAnalyze\SampleToAnalyze\ClassChild.cs").ReadToEnd();
SyntaxTree tree = CSharpSyntaxTree.ParseText(code);
var root = tree.GetRoot();
var compilation = CSharpCompilation.Create("MyCompilation", new[] { tree },
          new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) });
var model = compilation.GetSemanticModel(tree);

MethodDeclarationSyntax myMethod= tree.GetRoot().DescendantNodes()
                                      .OfType<MethodDeclarationSyntax>().Last();

StatementSyntax myStatement= SyntaxFactory.ParseStatement(@"Console.WriteLine();");
Run Code Online (Sandbox Code Playgroud)

我想在方法“ myMethod”的末尾插入“ myStatement”。

svi*_*ick 5

您可以使用AddBodyStatements方法创建MethodDeclarationSyntax添加了语句的新方法,然后使用ReplaceNode来更新SyntaxTree

var newRoot = root.ReplaceNode(myMethod, myMethod.AddBodyStatements(myStatement));
Run Code Online (Sandbox Code Playgroud)

这将创建有效的C#代码,但看起来很错误,因为它的缩进严重。修复的最简单方法可能是Formatter.Format

newRoot = Formatter.Format(newRoot, new AdhocWorkspace());
Run Code Online (Sandbox Code Playgroud)