在List <t> </t> </t>中查找IEnumerable <t>时,GetGenericTypeDefinition返回false

时间:2009-12-15 17:06:45

标签: c# reflection list ienumerable

关注this question,为什么enumerable在此:

Type type = typeof(List<string>);
bool enumerable = (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>));

返回false


编辑1

由于上述方法不起作用,确定一个类是否实现IEnumerable的最佳方法是什么?

4 个答案:

答案 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>));