Roslynを使用してC#コードを解析したいと思います。コード内の参照されるすべての型の修飾名を取得したいと思います。解析されたソースの外で宣言された型の識別子からSymbolInfoを取得
言ってやる例えば、私はこのコードのスニペット解析したい:私はIdentifierNameSyntaxを取得する場合、この例では
SyntaxTree tree = CSharpSyntaxTree.ParseText(source);
CSharpCompilation compilation = CSharpCompilation.Create("test", new[] { tree });
SemanticModel semanticModel = compilation.GetSemanticModel(tree, false);
CompilationUnitSyntax root = (CompilationUnitSyntax)tree.GetRoot();
IEnumerable<IdentifierNameSyntax> identifiers = root.DescendantNodes()
.Where(s => s is IdentifierNameSyntax)
.Cast<IdentifierNameSyntax>();
foreach (IdentifierNameSyntax i in identifiers)
{
SymbolInfo info = semanticModel.GetSymbolInfo(i);
if (info.Symbol == null)
{
Console.WriteLine("Unknown :(");
}
else
{
Console.WriteLine(info.Symbol.ContainingNamespace?.Name + "." + info.Symbol.ContainingType?.Name + "." + info.Symbol.Name);
}
}
:私は次のコードを使用し、それを解析するには
using System;
namespace RoslynTest
{
public class Test
{
public static void Main()
{
String a = "Hello, World!";
Console.WriteLine(a);
}
}
}
をそれは "String"を記述し、info.Symbolはnullになります。私はフルネームのSystem.Stringを知るためにいくつかの方法をお勧めします。
- 解析されたソース外で宣言された型のIdentifierNameSyntaxからSymbolInfoを取得するにはどうすればよいですか?
- usingステートメントからSemanticModelを構築する方法はありますか?
'.OfType()'を使い、 'info.Symbol.ToString()'を使います。 –
SLaks