2013-06-26 26 views
4

只要發現羅斯林,請耐心等待。使用Roslyn如何使用指令更新類?

我想更新使用指令在我的班上名列前茅的,包括額外的statment,例如:

using System; 

public class Foo { 

} 

應該改爲:

using System; 
using Custom.Bar; 

public class Foo { 

} 

我看到,我可以覆蓋SyntaxRewriter我已經完成了這個工作來解決方法級別的代碼,但是我看不到可能讓我訪問這些使用指令的重寫?

謝謝。

編輯:

我發現這個屬性,但我不知道如何修改它。

var tree = document.GetSyntaxTree().GetRoot() as SyntaxNode; 

var compilationUnitSyntax = (CompilationUnitSyntax) (tree); 

if (compilationUnitSyntax != null) 
     compilationUnitSyntax.Usings.Add(); 

不幸的是UsingDirectiveSyntax是內部的,所以我如何添加一個! :D

+0

謝謝,相應地更新了。 – shenku

回答

9

要創建SyntaxNodes您必須使用方法中的Syntax類工廠方法。

,你可以添加一個新的使用與AddUsings方法類似

if (compilationUnitSyntax != null) 
{ 
    var name = Syntax.QualifiedName(Syntax.IdentifierName("Custom"), 
            Syntax.IdentifierName("Bar")); 
    compilationUnitSyntax = compilationUnitSyntax 
     .AddUsings(Syntax.UsingDirective(name).NormalizeWhitespace()); 
} 

注:由於不可改變的CompilationUnitSyntax你需要與AddUsings調用的結果重新分配你的compilationUnitSyntax變量。

+0

什麼是冠軍謝謝你! – shenku

+3

爲了創建像QualifiedNameSyntax這樣的東西,有時候更容易使用Syntax.ParseName,而不是直接構建所有的部分。 –

+0

我不明白爲什麼有3種方式可以給你印象,你可以添加一些東西到一個對象。 ('cus.Usings.Add()cus.AddUsings()cus.WithUsings()'),其中只有一個實際上給出了一個暗示,該對象是不可變的。 – StingyJack