从roslyn中的符号获取类型
本文关键字:获取 取类型 符号 roslyn | 更新日期: 2023-09-27 18:30:03
对于不同类型的符号,从Microsoft.CodeAnalysis.ISymbol获取System.Type的最佳通用方法是什么?(例如类声明、变量、属性等)
我希望能够对类型进行各种检查,例如检查该类型是否实现任何接口或是否能够转换为任何接口,就像检查System.type.一样
我遇到的问题是,用于表示符号的大多数具体类都是内部的(请参阅http://sourceroslyn.io/)并且我在ISymbol中找不到类型信息。
- 源名称类型符号
- LocalSymbol
我使用以下代码检索ISymbol
var objectSymbol = (ISymbol)model.GetDeclaredSymbol(obj.Node);
简单回答:你不能。没有合适的方法从ISymbol
(Roslyn)获得System.Type
(反射)。
朝着你想要的方向前进的一种选择是构建你的类型的完全限定名称,然后通过反射来查找(示例)。
不过,你可能应该问问自己,这是否是你首先需要做的事情——反思和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实例。