2012-09-12 8 views
8

Sto aggiungendo campi privati ​​in una classe utilizzando il metodo ClassDeclarationSyntax.AddMembers. I campi appaiono nella classe, ma mi piacerebbe sapere come aggiungere i campi in posizioni specifiche. A partire da ora, vengono aggiunti alla fine della classe all'interno della direttiva #if che sembra valutare true al momento dell'esecuzione della generazione del codice.Aggiunta di membri della classe in posizioni specifiche utilizzando Roslyn?

L'esecuzione del codice:

var tree = SyntaxTree.ParseCompilationUnit(@" 
namespace Test 
{ 
    public class A 
    { 
#if !SILVERLIGHT 
     public int someField; 
#endif 
    } 
}"); 
var field = 
    Syntax.FieldDeclaration(
     Syntax.VariableDeclaration(
      Syntax.PredefinedType(
       Syntax.Token(
        SyntaxKind.StringKeyword)))) 
    .WithModifiers(Syntax.Token(SyntaxKind.PrivateKeyword)) 
    .AddDeclarationVariables(Syntax.VariableDeclarator("myAddedField")); 
var theClass = tree.GetRoot().DescendantNodes() 
    .OfType<ClassDeclarationSyntax>().First(); 
theClass = theClass.AddMembers(field).NormalizeWhitespace(); 
System.Diagnostics.Debug.Write(theClass.GetFullText()); 

si tradurrà in questo:

public class A 
{ 
#if !SILVERLIGHT 
    public int someField; 
    private string myAddedField; 
#endif 
} 

E vorrei per ottenere questo risultato:

public class A 
{ 
    private string myAddedField; 
#if !SILVERLIGHT 
    public int someField; 
#endif 
} 
+1

Non vedo il comportamento che descrivi. Potresti mostrarci un esempio di questo problema? – svick

+0

Spiacente, corretto la mia domanda e aggiunto codice di esempio. – illodin

risposta

7

Per fare questo, si dovrà per individuare esattamente dove si desidera posizionare il nuovo membro e quindi modificare di conseguenza l'elenco dei membri della classe. Qualcosa di simile:

private static SyntaxList<MemberDeclarationSyntax> AddBeforeIfDirective(
    SyntaxList<MemberDeclarationSyntax> oldMembers, 
    MemberDeclarationSyntax newMember) 
{ 
    var ifIndex = oldMembers.IndexOf(
     member => member.GetLeadingTrivia() 
      .Any(t => t.Kind == SyntaxKind.IfDirective)); 
    return oldMembers.Insert(ifIndex, newMember); 
} 


… 

var newMembers = AddBeforeIfDirective(theClass.Members, field); 

theClass = theClass.WithMembers(newMembers).NormalizeWhitespace(); 
Problemi correlati