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