2012-09-12 14 views
8

Estoy agregando campos privados en una clase utilizando el método ClassDeclarationSyntax.AddMembers. Los campos aparecen en la clase, pero me gustaría saber cómo agregar los campos en ubicaciones específicas. A partir de ahora, se agregan al final de la clase dentro de la directiva #if que pasa a ser verdadera en el momento de ejecutar la generación de código.¿Agregar miembros de la clase a ubicaciones específicas usando Roslyn?

Ejecutar el código:

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()); 

dará lugar a esto:

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

Y me gustaría conseguir este resultado:

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

No veo el comportamiento que describes. ¿Podría mostrarnos una muestra donde aparece este problema? – svick

+0

Disculpe, corrigí mi pregunta y agregué un código de ejemplo. – illodin

Respuesta

7

Para ello, tendrá para ubicar exactamente dónde desea colocar el nuevo miembro y luego modificar la lista de los miembros de la clase en consecuencia. Algo como:

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(); 
Cuestiones relacionadas