首页 > 解决方案 > Roslyn 中的 INamedTypeSymbol 继承关系

问题描述

我已经为具体类型创建了 INamedTypeSymbol 使用GetTypeByMetadataName

INamedTypeSymbol listTypeSymbol = context.SemanticModel.Compilation.GetTypeByMetadataName("System.Collections.Generic.List`1");
INamedTypeSymbol collectionTypeSymbol = context.SemanticModel.Compilation.GetTypeByMetadataName("System.Collections.Generic.ICollection`1");

其中一个是运行时类型的符号List<T>,另一个是运行时类型的符号ICollection<T>List<T>类型派生自 的类型ICollection<T>

如何检查 INamedTypeSymbol 的继承关系?

我尝试使用一种ClassifyConversion方法来做到这一点

Conversion con = context.SemanticModel.Compilation.ClassifyConversion(listTypeSymbol, collectionTypeSymbol);

但是,此函数返回转换的显式参考值。我预计会看到类似隐式参考值的东西。

标签: c#roslyn

解决方案


这是一个复杂的问题。

GetTypeByMetadataName("System.Collections.Generic.List`1")返回一个开放的泛型类型,它实际上是一个类型构造函数,可用于创建具有特定参数的封闭泛型类型。

谈论开放泛型类型之间的转换是没有意义的;两种类型A<>,如果被声明为或更复杂的关系,B<>则可能具有不同的可转换性。B<>B<T> : A<List<T>>

您只能检查共享相同类型参数的封闭泛型类型之间的可转换性。为此,请调用Construct()并传递类型参数的类型。


推荐阅读