GetElementType()
возвращает тип элемента массива.List<T>
не является типом массива и, следовательно, не имеет «тип элемента».
Если вы хотите получить тип элементов, которые генерирует случайный IEnumerable<T>
, попробуйте что-то вроде этого:
public static Type GetEnumerableType(Type type)
{
if (type == null)
throw new ArgumentNullException("type");
if (type.IsGenericType && type.GetGenericTypeDefinition() == typeof(IEnumerable<>))
return type.GetGenericArguments()[0];
var iface = (from i in type.GetInterfaces()
where i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEnumerable<>)
select i).FirstOrDefault();
if (iface == null)
throw new ArgumentException("Does not represent an enumerable type.", "type");
return GetEnumerableType(iface);
}
Обратите внимание, что типы могут реализовывать более одной версии одного и того же универсального интерфейса;например, тип может реализовывать как IEnumerable<int>
, так и IEnumerable<string>
.Как вы справитесь с этим делом, зависит от вас.Метод, который я предоставлю, возьмет тот тип интерфейса, который ему передан во время выполнения.
См. пример использования вышеуказанного метода для ideone.