2017-07-18 7 views
1

Il y a un moyen d'ajouter un membre à une classe avec roslyn? Je veux ajouter:Ajout d'une nouvelle déclaration de champ à la classe avec Roslyn

public int number {get;set;} 

MISE À JOUR J'ai utilisé ce code:

 PropertyDeclarationSyntax o = 
     SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("public 
     System.Windows.Forms.Timer"), "Ticker { get; set; }"); 

     var newRoot = root.ReplaceNode(oldMethod, oldMethod.AddMembers(o)); 
     newRoot = Formatter.Format(newRoot, new AdhocWorkspace()); 

     File.WriteAllText(file, newRoot.ToFullString()); 

Mais le résultat est ceci:

public class ClassChild 
{ 
    public int n; 
    private int n2; 

    public void method1() 
    { 
     string c = ""; 
     Console.WriteLine(); 
    } 

public System.Windows.Forms.TimerTicker { get; set; } 
} 

}

Je voudrais inline public System.Windows.Forms.TimerTicker {get; ensemble; } avec n et n2. Comment puis-je faire ceci ?

+0

pouvez-vous prolonger ce que vous voulez réaliser? Créer un analyseur \ fix pour ajouter des valeurs, ou un utilitaire autonome (pour le processus de construction, par exemple)? – Oxoron

+0

Je veux corriger une classe en ajoutant un nouveau champ. Dans le passé, je réussis à ajouter une nouvelle instruction à une méthode: /MethodDeclarationSyntax updateMethod = oldMethod.AddBodyStatements (ex); // var updatedRoot = root.ReplaceNode (oldMethod, updateMethod) .NormalizeWhitespace(); Je veux faire la même chose – blinkettaro

+0

Pouvez-vous m'aider? – blinkettaro

Répondre

1

Voir le code

private PropertyDeclarationSyntax MakeProperty() 
    { 
     string name = "n"; 

     // Create an auto-property 
     var property = 
      SyntaxFactory.PropertyDeclaration(SyntaxFactory.ParseTypeName("int"), name) 
      .AddModifiers(SyntaxFactory.Token(SyntaxKind.PublicKeyword)) 
      .AddAccessorListAccessors(
       SyntaxFactory.AccessorDeclaration(SyntaxKind.GetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)), 
       SyntaxFactory.AccessorDeclaration(SyntaxKind.SetAccessorDeclaration).WithSemicolonToken(SyntaxFactory.Token(SyntaxKind.SemicolonToken)) 
      ); 

     return property; 
    } 

    private async Task<Document> AddProperty(Document document, ClassDeclarationSyntax classeDecl, CancellationToken cancellationToken) 
    { 
     var root = await document.GetSyntaxRootAsync(cancellationToken); 
     var newClass = classeDecl.AddMembers(MakeProperty()); 
     return document.WithSyntaxRoot(root.ReplaceNode(classeDecl, newClass)); 
    } 

Automobile exemple genaration est prise de this question.