繁体   English   中英

从 roslyn 中的符号获取类型

[英]Getting type from a symbol in roslyn

从 Microsoft.CodeAnalysis.ISymbol 为不同类型的符号获取 System.Type 的最佳通用方法是什么? (例如类声明、变量、属性等)

我希望能够对类型进行各种检查,例如检查该类型是否实现了任何接口或可强制转换为任何接口,就像可以检查 System.Type 一样。

我遇到的问题是大多数用于表示符号的具体类都是内部的(请参阅http://sourceroslyn.io/ ),并且我在 ISymbol 中找不到 tye 类型信息。

  • 源命名类型符号
  • 本地符号

我使用以下代码检索 ISymbol

var objectSymbol = (ISymbol)model.GetDeclaredSymbol(obj.Node);

简短的回答:你不能。 没有从ISymbol (Roslyn) 获取System.Type (反射)的正确方法。

朝着您想要的方向前进的一种选择是构建您的类型的完全限定名称,然后通过反射进行查找( 示例)。

您或许应该先问问自己,这是否是您首先需要做的事情——reflection 和 Roslyn 并不是真的打算一起工作。

但是,您感兴趣的内容也可以通过 Roslyn 完成。 这里的关键是使用为您提供所有这些信息的语义模型。 所有声明(与用法相反)都有一个特定的重载可用,它允许您获取声明符号并以适当的类型返回它(例如本例中的INamedTypeSymbol )。

以下面的例子为例:

const string source = @"
using System;

namespace MyNamespace 
{
    class MyClass : IDisposable
    {
        void Method()
        {
            MyClass nameOfVariable, another;
        }
    }
}
";
var tree = CSharpSyntaxTree.ParseText(source);
var compilation = CSharpCompilation.Create("MyCompilation", new[] { tree }, new[] { MetadataReference.CreateFromFile(typeof(object).Assembly.Location) });
var semanticModel = compilation.GetSemanticModel(tree);
var root = tree.GetRoot();

var classSymbol = semanticModel.GetDeclaredSymbol(root.DescendantNodes().OfType<ClassDeclarationSyntax>().First());
Console.WriteLine(string.Join(", ", classSymbol.AllInterfaces));

这将显示该类实现的所有接口。 但是请记住,这仅指当前定义——如果您也对基本类型感兴趣,则必须自己浏览层次结构。

在您的场景中,您应该能够将其转换为正确的类型(假设您正在检查声明节点):

var objectSymbol = (INamedTypeSymbol) model.GetDeclaredSymbol(obj.Node);

我认为这就是你要找的:

var castedProperty = (IPropertySymbol) property;
var type = castedProperty.Type.Name;

变量 'property' 是一个 ISymbol 实例。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM