Mam działający kod, który załaduje plik .cs do klasy Syntaktypy Roslyn, utworzy nowy PropertyDeclarationSyntax, wstawi go do klasa i ponownie zapisz plik .cs. Robię to jako doświadczenie edukacyjne, a także niektóre potencjalne przyszłe pomysły. Zauważyłem, że naprawdę nie ma pełnej dokumentacji API Roslyn gdziekolwiek i nie jestem pewien, czy robię to sprawnie. Moją główną troską jest to, że nazywam "root.ToFullString()" - podczas gdy działa, czy jest to właściwy sposób?C# Roslyn API, Czytanie pliku .cs, aktualizowanie klasy, pisanie z powrotem do pliku .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());
}
}
Dlaczego dokładnie niepokoi cię 'ToFullString()'? – svick
Nie mogę znaleźć żadnej dokumentacji dla klasy i nie jestem pewien, czy jest to najlepszy sposób wyodrębnienia reprezentacji łańcuchowej drzewa składni i ponownego wyprowadzenia pliku CS. Obawiam się, że mogą istnieć artefakty i inne tego typu rzeczy nieodpowiednie do generowania kodu. – ShaunO