14

有没有办法确定一个对象是否是一个通用列表?我不会知道列表的类型,我只知道它是一个列表。我怎样才能确定呢?

4

6 回答 6

23

这将返回“真”

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

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

您是否想知道它是否完全是一个“列表”......或者您是否可以接受它是 IEnumerable 和 Generic?

于 2008-10-30T00:32:03.143 回答
7

以下方法将返回泛型集合类型的项目类型。如果该类型未实现 ICollection<>,则返回 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<> 的类型,例如:

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();
}
于 2008-10-30T00:32:32.847 回答
3

接受的答案不保证 IList<> 的类型。检查这个版本,它对我有用:

private static bool IsList(object value)
{
    var type = value.GetType();
    var targetType = typeof (IList<>);
    return type.GetInterfaces().Any(i => i.IsGenericType 
                                      && i.GetGenericTypeDefinition() == targetType);
}
于 2016-02-21T17:06:47.677 回答
2

尝试:

if(yourList.GetType().IsGenericType)
{
  var genericTypeParams = yourList.GetType().GetGenericArguments;
  //do something interesting with the types..
}
于 2008-10-30T00:30:57.810 回答
0

这个问题是模棱两可的。

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

  • 一个列表<SomeType> ?

  • 从 List<SomeType> 派生的类?

  • 实现 IList<SomeType> 的类(在这种情况下,可以将数组视为通用列表 - 例如 int[] 实现 IList<int>)?

  • 一个通用并实现 IEnumerable 的类(这是在接受的答案中提出的测试)?但这也会将以下相当病态的类视为通用列表:

.

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

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

于 2008-10-30T13:53:36.037 回答
-1

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

于 2008-10-30T00:30:05.690 回答