我有这个工作代码,将加载一个.cs文件到Roslyn SyntaxTree类中,创建一个新的PropertyDeclarationSyntax,将它插入到类,然后重新编写.cs文件。我正在做这个学习经历以及一些潜在的未来想法。我发现在任何地方都没有一个完整的Roslyn API文档,我不确定我是否有效地做到了这一点。我主要关心的是我在哪里调用'root.ToFullString()' - 虽然它的工作,这是做到这一点的正确方法?C#Roslyn API,读取一个.cs文件,更新一个类,写回.cs文件
using System.IO;
using System.Linq;
using Roslyn.Compilers;
using Roslyn.Compilers.CSharp;
class RoslynWrite
{
public RoslynWrite()
{
const string csFile = "MyClass.cs";
// Parse .cs file using Roslyn SyntaxTree
var syntaxTree = SyntaxTree.ParseFile(csFile);
var root = syntaxTree.GetRoot();
// Get the first class from the syntax tree
var myClass = root.DescendantNodes().OfType<ClassDeclarationSyntax>().First();
// Create a new property : 'public bool MyProperty { get; set; }'
var myProperty = Syntax.PropertyDeclaration(Syntax.ParseTypeName("bool"), "MyProperty")
.WithModifiers(Syntax.Token(SyntaxKind.PublicKeyword))
.WithAccessorList(
Syntax.AccessorList(Syntax.List(
Syntax.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration)
.WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken)),
Syntax.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration)
.WithSemicolonToken(Syntax.Token(SyntaxKind.SemicolonToken)))));
// Add the new property to the class
var updatedClass = myClass.AddMembers(myProperty);
// Update the SyntaxTree and normalize whitespace
var updatedRoot = root.ReplaceNode(myClass, updatedClass).NormalizeWhitespace();
// Is this the way to write the syntax tree? ToFullString?
File.WriteAllText(csFile, updatedRoot.ToFullString());
}
}
为什么你关心'ToFullString()'? – svick
我无法找到该类的任何文档,我不确定这是提取语法树的字符串表示形式并重新输出CS文件的最佳方式。我担心可能存在人为因素和其他不适合代码生成的情况。 – ShaunO