でプロパティからタイプを取得します。これが可能か実用的なものなのかどうかはわかりません。私はこのように見えるいくつかのクラスを持ち、それらはすべて基底クラスから派生します。私はこのようになりますいくつかのコードを解釈しようとしているロスリンを使用したロスリン
考えるClassDeclarationSyntax
Foo
のために、私はこれを行うことができます:
var prop = syntax.DescendantNodes().OfType<PropertyDeclarationSyntax>()
.FirstOrDefault(p => p.Identifier.ToString() == "BarType");
または指定をINamedTypeSymbol
Foo
ために、私はこれを行うことができます:
var member = symbol.GetMembers("BarType").FirstOrDefault();
をしかし、私はどこへ行くかわかりませんそこから。
最後に、さらなる分析のためにMyBar
のシンボルを取得したいので、文字列"MyBar"
を取得することは、完全修飾ではないので、助けにならないかもしれません。
提案がありますか?
EDIT:
は、私はこのようなプロジェクトとコンパイルを取得しています:
var workspace = MSBuildWorkspace.Create();
var project = workspace.OpenProjectAsync(projectPath).Result;
var compilation = project.GetCompilationAsync().Result;
compilation
がここCSharpCompilation
です。そこから私はこのような何か:
foreach (var doc in project.Documents)
{
Console.WriteLine($"Analyzing {doc.Name}");
//var model = doc.GetSemanticModelAsync().Result;
var tree = doc.GetSyntaxTreeAsync().Result;
var root = tree.GetRoot();
var model = compilation.GetSemanticModel(tree);
var classes = root.DescendantNodes().OfType<ClassDeclarationSyntax>();
foreach (var syntax in classes)
{
var symbol = model.GetDeclaredSymbol(syntax);
//... need to analyze properties in the class here...
}
}
私はmodel
を得るいずれかの方法を私はGetTypeSymbol
メソッドを持っていないようですSyntaxTreeSemanticModel
で終わります。
あなたが少しをしてください手の込んだてもらえますか?私は 'member 'に' GetTypeSymbol'を見つけることができません。 –
@MattBurland:そのメソッドは、 'SemanticModel'にあります。これは' Compilation'か 'Project'に由来します。 – SLaks
私はあなたの助けに感謝しますが、私はまだそれを見ていません。私は、私がやろうとしていることの多くを含めるために少し質問を編集しました。私は 'project.GetCompilationAsync()。Result'からコンパイルを得て、' SemanticModel'を 'compilation 'から得ることができます。GetSemanticModel(tree) 'が返されますが、結果として得られるモデルにはまだ' GetTypeSymbol() 'メソッドがありません –