关注this question,为什么enumerable
在此:
Type type = typeof(List<string>);
bool enumerable = (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>));
返回false
?
由于上述方法不起作用,确定一个类是否实现IEnumerable的最佳方法是什么?
答案 0 :(得分:8)
在此,我可以使用GetListType(type)
并检查null
:
static Type GetListType(Type type) {
foreach (Type intType in type.GetInterfaces()) {
if (intType.IsGenericType
&& intType.GetGenericTypeDefinition() == typeof(IEnumerable<>)) {
return intType.GetGenericArguments()[0];
}
}
return null;
}
答案 1 :(得分:4)
由于
(typeof(List<String>)).GetGenericTypeDefinition()
正在返回
typeof(List<>)
GetGenericTypeDefinition
只能返回一种类型,而不是Type
的目标实例实现的所有未绑定类型。
确定X<T>
是否实现IY<T>
Reify T(即使其成为真实类型),并检查具体类型。即是X<string>
实施IY<string>
。这可以通过反射或使用as
运算符来完成。
Type.GetInterafces()
(或Type.GetInterface(t)
)。
第二个会更容易。特别是因为这也是假的:
Type t = typeof(List<string>).GetGenericTypeDefinition();
bool isAssign = typeof(IEnumerable<>).IsAssignableFrom(t);
答案 2 :(得分:2)
如果您想对特定的封闭泛型类型进行快速测试 - 例如,检查List<string>
是否实现IEnumerable<string>
- 那么您可以执行以下操作:
Type test = typeof(List<string>);
bool isEnumerable = typeof(IEnumerable<string>).IsAssignableFrom(test);
如果您想要一个适用于任何IEnumerable<T>
的更通用的解决方案,那么您需要使用类似的内容:
Type test = typeof(List<string>);
bool isEnumerable = test.GetInterfaces().Any(i =>
i.IsGenericType && (i.GetGenericTypeDefinition() == typeof(IEnumerable<>)));
答案 3 :(得分:1)
以下命令返回true,并且有点关键,检查接口:
enumerable = typeof(List<string>).GetInterfaces()
.Contains(typeof(IEnumerable<string>));