C# 我们可以从Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax获取System.Type吗?

C# 我们可以从Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax获取System.Type吗?,c#,roslyn,roslyn-code-analysis,C#,Roslyn,Roslyn Code Analysis,我们可以从Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax获得System.Type或基本上完全限定的类型名吗?问题是,TypeSyntax返回类型的名称,因为它是在可能不是完全限定类名的代码中编写的,我们无法从中找到类型。要获得一段语法的完全限定名,需要使用SemanticModel访问其符号。我在我的博客上写了一本语义模型指南: 根据你的数据,我假设你在看田地 var tree = CSharpSyntaxTree.ParseText(@" cl

我们可以从Microsoft.CodeAnalysis.CSharp.Syntax.TypeSyntax获得System.Type或基本上完全限定的类型名吗?问题是,TypeSyntax返回类型的名称,因为它是在可能不是完全限定类名的代码中编写的,我们无法从中找到类型。

要获得一段语法的完全限定名,需要使用
SemanticModel
访问其符号。我在我的博客上写了一本语义模型指南:

根据你的数据,我假设你在看田地

var tree = CSharpSyntaxTree.ParseText(@"
class MyClass
{
    int firstVariable, secondVariable;
    string thirdVariable;
}");

var mscorlib = MetadataReference.CreateFromFile(typeof(object).Assembly.Location);
var compilation = CSharpCompilation.Create("MyCompilation",
    syntaxTrees: new[] { tree }, references: new[] { mscorlib });

//Get the semantic model
//You can also get it from Documents
var model = compilation.GetSemanticModel(tree);

var fields = tree.GetRoot().DescendantNodes().OfType<FieldDeclarationSyntax>();
var declarations = fields.Select(n => n.Declaration.Type);
foreach (var type in declarations)
{
    var typeSymbol = model.GetSymbolInfo(type).Symbol as INamedTypeSymbol;
    var fullName = typeSymbol.ToString();
    //Some types like int are special:
    var specialType = typeSymbol.SpecialType;
}

最后一点注意:对这些符号调用
.ToString()
,可以得到它们的完全限定名,但不能得到它们的完全限定元数据名。(嵌套类在其类名和泛型得到不同处理之前具有
+

注意,您无法轻松获得System.Type,但可以获得Microsoft.CodeAnalysis.ITypeSymble。乔希的回答已经对此给出了很好的解释。请注意,System.Type在大多数情况下并不是您真正想要的,因为这意味着您在流程中以您不想要的方式加载了类型。要获取元数据名称,我有一个方法,据我所知,在Roslyn中仍然没有可公开访问的方法。
var declaredVariables = fields.SelectMany(n => n.Declaration.Variables);
foreach (var variable in declaredVariables)
{
    var symbol = model.GetDeclaredSymbol(variable);
    var symbolFullName = symbol.ToString();
}