如何检查类型是否实现ICollection <t>

时间:2015-10-05 00:24:49

标签: c# .net reflection types

如何检查给定类型是否为HTTP/1.1 301 Moved Permanently Location: https://www.python.org// Connection: Keep-Alive Content-length: 0 的实现?

例如,假设我们有以下变量:

ICollection<T>

有没有办法确定ICollection<object> list = new List<object>(); Type listType = list.GetType(); 是否为通用listType

我尝试了以下内容,但没有运气:

ICollection<>

当然,我可以做到以下几点:

if(typeof(ICollection).IsAssignableFrom(listType))
       // ...

if(typeof(ICollection<>).IsAssignableFrom(listType))
      // ...

但这仅适用于if(typeof(ICollection<object>).IsAssignableFrom(listType)) // ... 类型。如果我有ICollection<object>则会失败。

2 个答案:

答案 0 :(得分:7)

你可以这样做:

bool implements = 
    listType.GetInterfaces()
    .Any(x =>
        x.IsGenericType &&
        x.GetGenericTypeDefinition() == typeof (ICollection<>));

答案 1 :(得分:1)

您可以尝试使用此代码,它适用于所有集合类型

    public static class GenericClassifier
    {
        public static bool IsICollection(Type type)
        {
            return Array.Exists(type.GetInterfaces(), IsGenericCollectionType);
        }

        public static bool IsIEnumerable(Type type)
        {
            return Array.Exists(type.GetInterfaces(), IsGenericEnumerableType);
        }

        public static bool IsIList(Type type)
        {
            return Array.Exists(type.GetInterfaces(), IsListCollectionType);
        }

        static bool IsGenericCollectionType(Type type)
        {
            return type.IsGenericType && (typeof(ICollection<>) == type.GetGenericTypeDefinition());
        }

        static bool IsGenericEnumerableType(Type type)
        {
            return type.IsGenericType && (typeof(IEnumerable<>) == type.GetGenericTypeDefinition());
        }

        static bool IsListCollectionType(Type type)
        {
            return type.IsGenericType && (typeof(IList) == type.GetGenericTypeDefinition());
        }
    }