Вы можете получить тип «T» из любого типа коллекции, который реализует IEnumerable со следующим:
public static Type GetCollectionItemType(Type collectionType)
{
var types = collectionType.GetInterfaces()
.Where(x => x.IsGenericType
&& x.GetGenericTypeDefinition() == typeof(IEnumerable<>))
.ToArray();
// Only support collections that implement IEnumerable<T> once.
return types.Length == 1 ? types[0].GetGenericArguments()[0] : null;
}
Обратите внимание, что он не поддерживает типы коллекций, которые реализуют IEnumerable дважды, например
public class WierdCustomType : IEnumerable<int>, IEnumerable<string> { ... }
Полагаю, вы могли бы вернуть массив типов, если вам нужно это поддерживать ...
Кроме того, вы также можете кэшировать результат для каждого типа коллекции, если вы делаете это много (например, в цикле).