c# - 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);
但是,此函数返回转换的显式参考值。我预计会看到类似隐式参考值的东西。
解决方案
这是一个复杂的问题。
GetTypeByMetadataName("System.Collections.Generic.List`1")
返回一个开放的泛型类型,它实际上是一个类型构造函数,可用于创建具有特定参数的封闭泛型类型。
谈论开放泛型类型之间的转换是没有意义的;两种类型A<>
,如果被声明为或更复杂的关系,B<>
则可能具有不同的可转换性。B<>
B<T> : A<List<T>>
您只能检查共享相同类型参数的封闭泛型类型之间的可转换性。为此,请调用Construct()
并传递类型参数的类型。
推荐阅读
- visual-studio - Visual Studio 安装项目:以管理员身份运行卸载 MSI
- android - 有没有办法在 Android 应用程序的 SQL lite 中执行平方根和三角函数?
- c++ - 使用 VS2019 构建时使用 Qt5qml 导致应用程序崩溃
- cypress - 根据 Cypress 中的布局选择元素
- javascript - 如何等待执行异步函数的 jQuery 事件处理程序
- dialogflow-es - 在 Google Dialogflow 中,如何保存变量直到会话结束
- javascript - 如何解决需要适当加载器的 npm 错误?
- python - KeyError Traceback(最近一次调用最后一次)
- python - 如何检查列表是否包含在python中字典的任何键中?
- javascript - React axios 触发一堆 get 请求