IEnumerable<T> myEnumerable;
Type type = myEnumerable.GetType().GetGenericArguments()[0];
Thusly
IEnumerable<string> strings = new List<string>();
Console.WriteLine(strings.GetType().GetGenericArguments()[0]);
отпечатки System.String
.
См. MSDN для Type.GetGenericArguments
.
Редактировать: Я полагаю, что это решит проблемы в комментариях:
// returns an enumeration of T where o : IEnumerable<T>
public IEnumerable<Type> GetGenericIEnumerables(object o) {
return o.GetType()
.GetInterfaces()
.Where(t => t.IsGenericType
&& t.GetGenericTypeDefinition() == typeof(IEnumerable<>))
.Select(t => t.GetGenericArguments()[0]);
}
Некоторые объекты реализуют более одного универсального IEnumerable
, поэтому необходимо вернуть их перечисление.
Редактировать: Хотя, я должен сказать, это ужасная идея для класса реализовать IEnumerable<T>
для более чем одного T
.