Используя отражение (и немного LINQ), вы можете легко сделать это:
public static IEnumerable<Type> GetIListTypeParameters(Type type)
{
// Query.
return
from interfaceType in type.GetInterfaces()
where interfaceType.IsGenericType
let baseInterface = interfaceType.GetGenericTypeDefinition()
where baseInterface == typeof(IList<>)
select interfaceType.GetGenericArguments().First();
}
Во-первых, вы получаете интерфейсы по типу и отфильтровываете только те, которые являются универсальным типом.
Затем вы получите определение общего типа для этих типов интерфейса и посмотрите, совпадает ли оно с IList<>
.
Оттуда просто получить общие аргументы для исходного интерфейса.
Помните, что тип может иметь несколько реализаций IList<T>
, поэтому возвращается IEnumerable<Type>
.