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

1 に答える 1

3

CTP に含まれているImplementINotifyPropertyChangedサンプルをご覧ください。それが行うことの 1 つは、イベントとメソッドを追加することです。プロパティにも同じ戦略が適用されます。

于 2013-10-29T20:24:41.173 に答える