c# - List<T> 实例之间的关系

标签 c# .net generics list

有什么方法可以通过反射来判断类型 A 的通用列表与类型 B 的通用列表相关吗?例如,我有一个 List<string>和一个 List<int> .我如何通过反射判断这两种类型都是 List<T> 的“实例”? .我想我遇到了问题,因为 List<T>不是真正的类型。你不能做 typeof(List<T>)例如。 List<T>我猜是一个编译器技巧。那么有没有办法确定两种不同的类型是否来自 List<T>

最佳答案

当然可以... List<>实际上是所谓的“未绑定(bind)泛型类型”,意思是它没有用类型参数化。当指定类型参数时,它被称为“绑定(bind)泛型类型”。涉及“原始”类型参数的类型,如 List<T>是一种“开放通用类型”,并且只涉及实际类型,例如 List<int>是一个“封闭的通用类型”。在 C# 中可以使用未绑定(bind)泛型类型的唯一情况是在 typeof 运算符中。要访问未绑定(bind)类型或封闭类型,您可以执行以下操作:

Type listOfT = typeof(List<>); // unbound type
Type listOfString = typeof(List<string>); // closed bound type
Type listOfInt32 = typeof(List<int>); // closed bound type

Assert.IsTrue(listOfString.IsGenericType);

Assert.AreEqual(typeof(string), listOfString.GetGenericTypeParameters()[0]);
Assert.AreEqual(typeof(List<>), listOfString.GetGenericTypeDefinition());

Type setOfString = typeof(HashSet<string>);

Assert.AreNotEqual(typeof(List<>), setOfString.GetGenericTypeDefinition());

关于c# - List<T> 实例之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2091646/

相关文章:

c# - 如何禁用 Windows Phone 的输入预测和字母输入校正?

c# - 从 app.config 加载自定义部分时配置系统无法初始化错误

c# - jQuery 对话框在 Response.TransmitFile 之后不会从代码隐藏中关闭

.net - 用于 .NET 4.0 的 32 位 Oracle 客户端安装的 Oracle.DataAccess.dll?

c# - 字符串的实际长度

C# 连接到端口 990 时 FTPS 卡住/超时

c# - ef 中的奇怪语法

delphi - 如何使用 TMyRecord 中的通用子列表释放通用 TList<TMyRecord>

c# - 泛型类型参数的多个约束的优先级

java - 从泛型返回异常