Roslyn을 사용하여 C# 코드를 구문 분석하고 코드에서 참조 된 모든 유형의 정규화 된 이름을 가져 오려고합니다. 나는 IdentifierNameSyntax에 도착하면,이 예제에서는구문 분석 된 소스 외부에서 선언 된 유형의 식별자에서 SymbolInfo 가져 오기
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