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

时间:2015-10-29 18:19:13

标签: c# roslyn roslyn-code-analysis

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

1 个答案:

答案 0 :(得分:5)

要获取一段语法的完全限定名称,您需要使用select (END_DT - START_DT)*60*60*24 from MY_TABLE; 来访问其符号。我在我的博客上写了一个语义模型指南:Learn Roslyn Now: Introduction to the Semantic Model

根据您的previous question,我假设您正在查看字段。

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;
}

最后一点:在这些符号上调用var declaredVariables = fields.SelectMany(n => n.Declaration.Variables); foreach (var variable in declaredVariables) { var symbol = model.GetDeclaredSymbol(variable); var symbolFullName = symbol.ToString(); } 会为您提供完全限定的名称,但不会为其提供完全限定的元数据名称。 (嵌套类在其类名和泛型的处理方式不同之前都有.ToString()