2013-10-29 137 views
1

如果我想添加一個新的屬性到一個類型,我需要重建整個類型還是有辦法將屬性添加到現有的類型?由於只能替換節點,我是否必須替換整個類聲明節點?如果是的話,一個人會怎麼做?如何添加一個屬性定義到現有的類型

我發現這樣做的唯一方法是髒的,基本上歸結爲獲取類型的源代碼,找到第一個開放的括號,然後插入新的屬性源代碼,然後解析生成的文本,然後替換舊的類聲明節點與一個新的。

事情是這樣的:

var toTypeSymbol =(TypeSymbol)compilation.GetTypeByMetadataName(propertyTypeInfo.ToString()); 

var toTypeDeclarationSyntax = (ClassDeclarationSyntax) toTypeSymbol.DeclaringSyntaxNodes.First(); 

var origToTypeCode = toTypeSymbol.DeclaringSyntaxNodes.First().ToFullString(); 

var idx = origToTypeCode.IndexOf("{")+1; 

var newPropertyCode = String.Format(@" protected internal virtual {0} {0} {{get;set;}}",classSymbol.Name); 

var newTypeCode = origToTypeCode.Insert(idx, newPropertyCode); 

var newType = Syntax.ParseCompilationUnit(newTypeCode).NormalizeWhitespace(); 

var classDeclarationSyntax = newType.ChildNodes().OfType<ClassDeclarationSyntax>().First(); 

var temp = toTypeDeclarationSyntax.Parent.ReplaceNode(toTypeDeclarationSyntax,classDeclarationSyntax).NormalizeWhitespace(); 


Console.WriteLine(temp.ToFullString()); 

回答

3

你可以看看這包括在CTP的ImplementINotifyPropertyChanged樣品。它所做的一件事就是添加一個事件和一個方法。同樣的策略適用於屬性。

相關問題