C# 从已解析源外部声明的类型的标识符获取SymbolInfo

C# 从已解析源外部声明的类型的标识符获取SymbolInfo,c#,.net,roslyn,C#,.net,Roslyn,我想使用Roslyn来解析C#代码,并且我想获得代码中每个引用类型的限定名 例如,假设我想解析这段代码: using System; namespace RoslynTest { public class Test { public static void Main() { String a = "Hello, World!"; Console.WriteLine(a); }

我想使用Roslyn来解析C#代码,并且我想获得代码中每个引用类型的限定名

例如,假设我想解析这段代码:

using System;

namespace RoslynTest
{
    public class Test
    {
        public static void Main()
        {
            String a = "Hello, World!";
            Console.WriteLine(a);
        }
    }
}
要解析它,我使用以下代码:

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);
    }
}
SyntaxTree-tree=CSharpSyntaxTree.ParseText(源代码);
csharpcomilation=csharpcomilation.Create(“test”,new[]{tree});
SemanticModel SemanticModel=compilation.GetSemanticModel(树,false);
CompilationUnitSyntax根=(CompilationUnitSyntax)树。GetRoot();
IEnumerable标识符=根。子代节点()
.其中(s=>s是IdentifierNameSyntax)
.Cast();
foreach(标识符中的IdentifierNameSyntax i)
{
SymbolInfo=semanticModel.GetSymbolInfo(i);
如果(info.Symbol==null)
{
Console.WriteLine(“未知:(”);
}
其他的
{
Console.WriteLine(info.Symbol.ContainingNamespace?.Name+“+info.Symbol.ContainingType?.Name+”+info.Symbol.Name);
}
}
在本例中,当我访问描述“String”的IdentifierNameSyntax时,info.Symbol将为null。我想通过某种方式了解全名System.String,以及引用的其他类型的全名

  • 如何从IdentifierNameSyntax获取解析源外部声明的类型的SymbolInfo
  • 有没有办法从using语句构造语义模型

您的实际问题是没有
字符串
类型

如果查看SemanticModel中的编译错误,您将看到一个类似的错误

您需要在
编译
中添加对mscorlib的引用,以便
System.String
存在。
一旦这样做,
info.Symbol
将不会为空。

您的实际问题是没有
字符串
类型

如果查看SemanticModel中的编译错误,您将看到一个类似的错误

您需要在
编译
中添加对mscorlib的引用,以便
System.String
存在。
一旦这样做,
info.Symbol
将不会为空。

另外,只需切题如下:

IEnumerable<IdentifierNameSyntax> identifiers = 
root.DescendantNodes().OfType<IdentifierNameSyntax>();
IEnumerable标识符=
类型()的root.degenantNodes();
而不是:

IEnumerable<IdentifierNameSyntax> identifiers = root.DescendantNodes()
    .Where(s => s is IdentifierNameSyntax)
    .Cast<IdentifierNameSyntax>();
IEnumerable标识符=根目录下的子目录节点()
.其中(s=>s是IdentifierNameSyntax)
.Cast();

另外,切题如下:

IEnumerable<IdentifierNameSyntax> identifiers = 
root.DescendantNodes().OfType<IdentifierNameSyntax>();
IEnumerable标识符=
类型()的root.degenantNodes();
而不是:

IEnumerable<IdentifierNameSyntax> identifiers = root.DescendantNodes()
    .Where(s => s is IdentifierNameSyntax)
    .Cast<IdentifierNameSyntax>();
IEnumerable标识符=根目录下的子目录节点()
.其中(s=>s是IdentifierNameSyntax)
.Cast();

使用
.OfType()
,并使用
info.Symbol.ToString()
。使用
.OfType()
,并使用
info.Symbol.ToString()
。谢谢,我添加了:
元数据引用=元数据引用.CreateFromFile(typeof(string).Assembly.Location)
这就解决了我的示例。是否有任何实用的方法可以从所有using语句中创建元数据引用?谢谢,我添加了:
MetadataReference=MetadataReference.CreateFromFile(typeof(string).Assembly.Location);
这就解决了我的例子。有没有实用的方法从所有using语句中创建元数据引用?