2012-09-12 11 views
8

ClassDeclarationSyntax.AddMembersメソッドを使用してプライベートフィールドをクラスに追加しています。フィールドはクラスに表示されますが、フィールドを特定の場所に追加する方法を知りたいと思います。現時点では#ifディレクティブ内のクラスの終わりに追加され、コード生成の実行時にtrueと評価されます。Roslynを使用してクラスメンバーを特定の場所に追加しますか?

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

は、このになります:

コード実行

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

をそして、私はこの結果を取得したいと思います:

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

あなたの行動は表示されません。この問題が発生した場所のサンプルを表示できますか? – svick

+0

申し訳ありませんが、私の質問が修正され、サンプルコードが追加されました。 – illodin

答えて

7

これを行うには、あなたが持っているだろうし新しいメンバーを配置する場所を正確に特定し、それに応じてクラスメンバーのリストを変更します。次のようなものがあります。

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(); 
関連する問題