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

本文关键字:类型 添加 定义 属性 | 更新日期: 2023-09-27 18:37:22

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

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

像这样:

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

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

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