如何将属性定义添加到现有类型

时间:2013-10-29 14:19:52

标签: c# roslyn

如果我想在类型中添加新属性,我是否需要重建整个类型,或者有没有办法将属性添加到现有类型?由于只能替换节点,我是否必须替换整个类声明节点?如果是这样,怎么会这样做?

我发现这样做的唯一方法是脏的,基本上归结为获取该类型的源代码,找到第一个打开的括号,并为属性插入新的源代码,然后解析生成的文本然后替换旧的具有新的类声明节点。

这样的事情:

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

1 个答案:

答案 0 :(得分:3)

您可以查看CTP中包含的ImplementINotifyPropertyChanged示例。它所做的一件事是添加一个事件和一个方法。同样的策略适用于属性。