2012-09-12 9 views
8

Dodaję prywatne pola do klasy przy użyciu metody ClassDeclarationSyntax.AddMembers. Pola pojawiają się w klasie, ale chciałbym wiedzieć, jak dodać pola do określonych lokalizacji. Na razie są one dodawane na końcu klasy wewnątrz dyrektywy #if, która ma wartość true w momencie generowania kodu.Dodawanie członków klasy do konkretnych lokalizacji za pomocą Roslyn?

Uruchamianie kodu:

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

spowoduje to:

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

I chciałbym, aby uzyskać ten wynik:

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

Nie widzę zachowania, które opisujesz. Czy możesz pokazać nam przykład, w którym pojawia się ten problem? – svick

+0

Przepraszamy, poprawiono moje pytanie i dodałem przykładowy kod. – illodin

Odpowiedz

7

Aby to zrobić, trzeba będzie zlokalizować, gdzie dokładnie chcesz umieścić nowego członka, a następnie odpowiednio zmodyfikować listę członków klasy. Coś takiego:

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(); 
Powiązane problemy