Можно ли определить, является ли объект общим списком? Я не буду знать тип списка, я просто знаю его список. Как я могу это определить?
Если объект является общим списком
Ответ 1
Это вернет "True"
List<int> myList = new List<int>();
Console.Write(myList.GetType().IsGenericType && myList is IEnumerable);
Вам интересно узнать, действительно ли это "Список"... или вы в порядке с IEnumerable и Generic?
Ответ 2
Следующий метод вернет тип элемента общего типа коллекции. Если тип не реализует 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();
}
Ответ 3
Try:
if(yourList.GetType().IsGenericType)
{
var genericTypeParams = yourList.GetType().GetGenericArguments;
//do something interesting with the types..
}
Ответ 4
Принятый ответ не гарантирует тип 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);
}
Ответ 5
Вопрос неоднозначен.
Ответ зависит от того, что вы подразумеваете под общим списком.
-
A List <SomeType>
-
Класс, который происходит из List <SomeType>
-
Класс, реализующий IList <SomeType> (в этом случае массив можно рассматривать как общий список - например, int [] реализует IList <int> )?
-
Класс, который является общим и реализует IEnumerable (это тест, предложенный в принятом ответе)? Но это будет также рассматривать следующий скорее патологический класс как общий список:
.
public class MyClass<T> : IEnumerable
{
IEnumerator IEnumerable.GetEnumerator()
{
return null;
}
}
Лучшее решение (например, использовать ли GetType, IsAssignableFrom и т.д.) будет зависеть от того, что вы имеете в виду.
Ответ 6
Функция GetType() в классе System.Object. Вы пробовали это?