如果object是Generic List

时间:2008-10-30 00:20:13

标签: c# .net vb.net list generics

有没有办法确定对象是否是通用列表?我不会知道列表的类型,我只知道它是一个列表。我该如何确定?

6 个答案:

答案 0 :(得分:23)

这将返回“True”

List<int> myList = new List<int>();

Console.Write(myList.GetType().IsGenericType && myList is IEnumerable);

你是否想知道它是否完全是一个“列表”...或者你是IEnumerable和Generic吗?

答案 1 :(得分:7)

以下方法将返回泛型集合类型的项类型。 如果类型没有实现ICollection&lt;&gt;然后返回null。

static Type GetGenericCollectionItemType(Type type)
{
    if (type.IsGenericType)
    {
        var args = type.GetGenericArguments();
        if (args.Length == 1 &&
            typeof(ICollection<>).MakeGenericType(args).IsAssignableFrom(type))
        {
            return args[0];
        }
    }
    return null;
}

编辑:上述解决方案假定指定的类型具有自己的通用参数。这不适用于实现ICollection的类型&lt;&gt;使用硬编码通用参数,例如:

class PersonCollection : List<Person> {}

这是一个处理这种情况的新实现。

static Type GetGenericCollectionItemType(Type type)
{
    return type.GetInterfaces()
        .Where(face => face.IsGenericType &&
                       face.GetGenericTypeDefinition() == typeof(ICollection<>))
        .Select(face => face.GetGenericArguments()[0])
        .FirstOrDefault();
}

答案 2 :(得分:2)

尝试:

if(yourList.GetType().IsGenericType)
{
  var genericTypeParams = yourList.GetType().GetGenericArguments;
  //do something interesting with the types..
}

答案 3 :(得分:2)

接受的答案并不保证IList&lt;&gt;的类型。 检查这个版本,它适用于我:

private static bool IsList(object value)
{
    var type = value.GetType();
    var targetType = typeof (IList<>);
    return type.GetInterfaces().Any(i => i.IsGenericType 
                                      && i.GetGenericTypeDefinition() == targetType);
}

答案 4 :(得分:0)

这个问题含糊不清。

答案取决于通用列表的含义。

  • 列表&lt; SomeType&gt;

  • 从List&lt; SomeType&gt;派生的类

  • 实现IList&lt; SomeType&gt;的类(在这种情况下,数组可以被认为是通用列表 - 例如int []实现IList&lt; int&gt;)?

  • 一个通用的类并实现IEnumerable(这是accepted answer中提出的测试)?但是,这也将考虑以下相当病态的类作为通用列表:

public class MyClass<T> : IEnumerable
{
    IEnumerator IEnumerable.GetEnumerator()
    {
        return null;
    }
}

最佳解决方案(例如,是否使用GetType,IsAssignableFrom等)取决于您的意思。

答案 5 :(得分:-1)

System.Object类中的一个GetType()函数。你试过了吗?