Roslyn中的INamedTypeSymbol继承关系

时间:2018-07-18 08:31:29

标签: c# roslyn

我已经使用GetTypeByMetadataName

为具体类型创建了INamedTypeSymbol。
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);

但是,此函数返回显式引用转换值。我应该会看到类似 The Implicit Reference 值的东西。

1 个答案:

答案 0 :(得分:2)

这是一个复杂的过程。

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

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

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