2008-10-30 5 views

ответ

22

Это вернет "True"

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

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

Вы заботитесь знать, если это точно "List" ... или ты хорошо с ним быть IEnumerable, и общий?

-1

Theres Функция GetType() в классе System.Object. Вы пробовали это?

+0

событие, хотя, возможно, это не «идеальный» ответ, я не могу понять, почему он попадает минус один.Давай, ребята, это не лучший ответ, но старайтесь не навредить чьей-то репутации. – 2008-10-30 00:56:32

+0

GetType вернет конкретный общий список, который он есть, в отличие от того, что это всего лишь общий список. – Dested 2008-10-30 00:59:11

2

Try:

if(yourList.GetType().IsGenericType) 
{ 
    var genericTypeParams = yourList.GetType().GetGenericArguments; 
    //do something interesting with the types.. 
} 
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; 
} 

Edit: выше решение предполагает, что заданный тип имеет общий параметр самостоятельно. Это не будет работать для типов, реализующих 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(); 
} 
0

Вопрос неоднозначный.

Ответ зависит от того, что вы подразумеваете под общим списком.

  • < Перечень SomeType >?

  • Класс, который происходит из списка <SomeType>?

  • класс, который реализует IList <SomeType> (в этом случае массив может рассматриваться как общий список - например, INT [] реализует IList <INT>)?

  • Класс, который является общим и реализует IEnumerable (это тест, предложенный в accepted answer)? Но это будет также рассматривать следующий скорее патологический класс как общий список:

.

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

Лучшее решение (например, следует ли использовать GetType, IsAssignableFrom и т.д.) будет зависеть от того, что вы имеете в виду.

1

Принятый ответ не гарантирует тип 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); 
} 
Смежные вопросы