Roslyn中的INamedTypeSymbol继承关系
INamedTypeSymbol inheritance relation in the 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);
不过这个函数returns一个显式引用值的转换。我预计会看到类似 隐式引用 值的内容。
这个比较复杂。
GetTypeByMetadataName("System.Collections.Generic.List`1")
returns 开放泛型类型,它实际上是一个类型构造函数,可用于创建具有特定参数的封闭泛型类型。
谈论开放泛型类型之间的转换没有意义;如果将 B<>
声明为 B<T> : A<List<T>>
或更复杂的关系,则 A<>
和 B<>
两种类型的转换可能不同。
您只能检查共享相同类型参数的 closed 通用类型之间的可转换性。为此,请调用 Construct()
并为类型参数传递类型。
我已经使用 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);
不过这个函数returns一个显式引用值的转换。我预计会看到类似 隐式引用 值的内容。
这个比较复杂。
GetTypeByMetadataName("System.Collections.Generic.List`1")
returns 开放泛型类型,它实际上是一个类型构造函数,可用于创建具有特定参数的封闭泛型类型。
谈论开放泛型类型之间的转换没有意义;如果将 B<>
声明为 B<T> : A<List<T>>
或更复杂的关系,则 A<>
和 B<>
两种类型的转换可能不同。
您只能检查共享相同类型参数的 closed 通用类型之间的可转换性。为此,请调用 Construct()
并为类型参数传递类型。