检查类型或实例是否实现 IEnumerable,无论类型 T 是什么

问题描述 投票:0回答:3

我在当前的项目中进行了大量的反思,并且我试图提供一些辅助方法以保持一切整洁。

我想提供一对方法来确定类型或实例是否实现

IEnumerable
– 无论类型
T
如何。这是我现在所拥有的:

public static bool IsEnumerable(this Type type)
{
    return (type is IEnumerable);
}

public static bool IsEnumerable(this object obj)
{
    return (obj as IEnumerable != null);
}

当我使用

测试它们时
Debug.WriteLine("Type IEnumerable:   " + typeof(IEnumerable).IsEnumerable());
Debug.WriteLine("Type IEnumerable<>: " + typeof(IEnumerable<string>).IsEnumerable());
Debug.WriteLine("Type List:          " + typeof(List<string>).IsEnumerable());
Debug.WriteLine("Type string:        " + typeof(string).IsEnumerable());
Debug.WriteLine("Type DateTime:      " + typeof(DateTime).IsEnumerable());
Debug.WriteLine("Instance List:      " + new List<string>().IsEnumerable());
Debug.WriteLine("Instance string:    " + "".IsEnumerable());
Debug.WriteLine("Instance DateTime:  " + new DateTime().IsEnumerable());

我得到的结果是:

Type IEnumerable:   False
Type IEnumerable<>: False
Type List:          False
Type string:        False
Type DateTime:      False
Instance List:      True
Instance string:    True
Instance DateTime:  False

type 方法似乎根本不起作用 – 我原本期望至少有一个

true
来直接匹配
System.Collections.IEnumerable

我知道

string
在技术上是可枚举的,尽管有一些注意事项。然而,理想情况下,在这种情况下,我需要辅助方法来返回
false
。我只需要具有定义的
IEnumerable<T>
类型的实例即可返回
true

我可能只是错过了一些相当明显的东西 - 谁能指出我正确的方向?

c# .net inheritance reflection types
3个回答
91
投票

以下行

return (type is IEnumerable);

询问“如果

Type
的实例,
type
IEnumerable
”,显然不是。

你想做的是:

return typeof(IEnumerable).IsAssignableFrom(type);

23
投票

要检查某种类型是否实现 IEnumerable 无论 T 是什么,都需要检查 GenericTypeDefinition。

public static bool IsIEnumerableOfT(this Type type)
{
    return type.GetInterfaces()
               .Append(type) // ensure this type is also checked
               .Any(x => x.IsGenericType
                      && x.GetGenericTypeDefinition() == typeof(IEnumerable<>));
}

16
投票

除了

Type.IsAssignableFrom(Type)
之外,你还可以使用
Type.GetInterfaces()
:

public static bool ImplementsInterface(this Type type, Type interfaceType)
{
    // Deal with the edge case
    if ( type == interfaceType)
        return true;

    bool implemented = type.GetInterfaces().Contains(interfaceType);
    return implemented;
}

这样,如果您想检查多个接口,您可以轻松修改

ImplementsInterface
以获取多个接口。

© www.soinside.com 2019 - 2024. All rights reserved.