現在、私はc#とroslynで単純なコードを分析しています。私は1つのソリューションの中のすべてのプロジェクトのすべてのドキュメントを解析し、このドキュメントの中で宣言されたクラスを取得する必要があります。RoslynはObjectCreationExpressionSyntaxでIdentifierNameを取得します
から例えば:私はProgram
がFoo
を使用して取得したい
class Program
{
static void Main(string[] args)
{
var foo = new Foo();
}
}
。
私はすでにすべてのドキュメントを解析し、内部で宣言されたクラスを取得します。
// all projects in solution
foreach (var project in _solution.Projects)
{
// all documents inside project
foreach (var document in project.Documents)
{
var syntaxRoot = await document.GetSyntaxRootAsync();
var model = await document.GetSemanticModelAsync();
var classes = syntaxRoot.DescendantNodes().OfType<ClassDeclarationSyntax>();
// all classes inside document
foreach (var classDeclarationSyntax in classes)
{
var symbol = model.GetDeclaredSymbol(classDeclarationSyntax);
var objectCreationExpressionSyntaxs = classDeclarationSyntax.DescendantNodes().OfType<ObjectCreationExpressionSyntax>();
// all object creations inside document
foreach (var objectCreationExpressionSyntax in objectCreationExpressionSyntaxs)
{
// TODO: Get the identifier value
}
}
}
}
問題がIdentifierName Foo
を取得することです。 debuggerを使用して、objectCreationExpressionSyntax.Type
を取得しました。Identifier.Text
が必要な値を取得しましたが、objectCreationExpressionSyntax.Type.Identifier
はプライベートであるようです。
SymbolFinder
を使用して、ソリューション内のクラスのすべての参照を見つけることができます。私はすでにすべてのドキュメントを解析する必要があるので、そのドキュメントは必要なくすべきです。
多分私は間違った経路にいるでしょうか?識別子値を取得するには?
これはどのようにするのですか?あなたのリンクは、私がこれを理解するのに本当に役立たなかった。もっと説明したり、コードを使ってください。 –
更新された回答が役立つことを願っています。 – Tamas
はい、ありがとうございます。おそらく、@Crowcoderが投稿したものと同じ優れたソリューションです。魔女の1つが私の必要性に合っているとわかるでしょう。ありがとう! –