




В классе System.Object есть функция GetType (). Вы пробовали это?
GetType вернет конкретный общий список, которым он является, в отличие от того факта, что это просто общий список.
Пытаться:
if (yourList.GetType().IsGenericType)
{
var genericTypeParams = yourList.GetType().GetGenericArguments;
//do something interesting with the types..
}
Это вернет "True"
List<int> myList = new List<int>();
Console.Write(myList.GetType().IsGenericType && myList is IEnumerable);
Вы хотите знать, точно ли это «Список» ... или вас устраивает то, что он IEnumerable и Generic?
В настоящее время это не компилируется. dotnetfiddle.net/T0Q8w3. Может быть, это было в 2008 году.
Привет, @sonicblis, «IEnumerable» находится в пространстве имен «System.Collections». У вас не было using System.Collections; в вашей скрипке. Все еще компилируется в 2016 году :)
Следующий метод вернет тип элемента универсального типа коллекции. Если тип не реализует 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();
}
Вопрос неоднозначный.
Ответ зависит от того, что вы подразумеваете под общим списком.
Список <SomeType>?
Класс, производный от List <SomeType>?
Класс, реализующий IList <SomeType> (в этом случае массив можно рассматривать как общий список - например, int [] реализует IList <int>)?
Общий класс, реализующий IEnumerable (это тест, предложенный в принятый ответ)? Но это также будет рассматривать следующий довольно патологический класс как общий список:
.
public class MyClass<T> : IEnumerable
{
IEnumerator IEnumerable.GetEnumerator()
{
return null;
}
}
Лучшее решение (например, использовать ли GetType, IsAssignableFrom и т. д.) Будет зависеть от того, что вы имеете в виду.
Принятый ответ не гарантирует тип 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);
}
Событие, хотя, возможно, это не «идеальный» ответ, я не понимаю, почему он помечен как минус один. Да ладно, ребята, это не лучший ответ, но постарайтесь не навредить чьей-либо репутации.