Как добавить определение свойства в существующий тип

Если я хочу добавить новое свойство в тип, нужно ли перестраивать весь тип или есть способ добавить свойство в существующий тип? Поскольку можно заменить только узлы, нужно ли мне заменять весь узел объявления класса? Если так, то как бы это сделать?

Единственный способ сделать это - грязный, и в основном сводится к тому, чтобы получить исходный код типа, найти первую открытую скобку и вставить новый исходный код свойства, затем проанализировать полученный текст и затем заменить старый узел объявления класса. с новым.

Что-то вроде этого:

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 ответ

Решение

Вы могли бы взглянуть на ImplementINotifyPropertyChanged образец, который включен в ОСАГО. Одна из вещей, которую он делает, это добавляет событие и метод. Та же стратегия применяется к свойствам.

Другие вопросы по тегам