Я хочу написать метод, который использует Reflection, чтобы сказать, реализует ли данный тип IList<T>
. Например:
IsGenericList(typeof(int)) // should return false
IsGenericList(typeof(ArrayList)) // should return false
IsGenericList(typeof(IList<int>)) // should return true
IsGenericList(typeof(List<int>)) // should return true
IsGenericList(typeof(ObservableCollection<int>)) // should return true
В моем использовании я могу предположить, что тип всегда будет инстанцированным универсальным типом (или чем-то, что вообще не является универсальным).
К сожалению, это не так просто, как должно быть. Очевидное решение:
public bool IsGenericList(Type type)
{
return typeof(IList<>).IsAssignableFrom(type);
}
не работает; всегда возвращает false. По-видимому, неинстанцированные универсальные типы, такие как IList<>
, не реализуют IsAssignableF, как я ожидал от них: IList<>
нельзя назначить из List<T>
.
Я тоже пробовал это:
public bool IsGenericList(Type type)
{
if (!type.IsGenericType)
return false;
var genericTypeDefinition = type.GetGenericTypeDefinition();
return typeof(List<>).IsAssignableFrom(genericTypeDefinition);
}
Т.е., превратить type
в его неинстанцированный обобщенный тип, например IList<int>
-> IList<>
, а затем снова попробовать IsAssignableFrom. Это вернет true, когда type является экземпляром IList<T>
, таким как IList<int>
, IList<object>
и т. Д. Но он возвращает false для классов, которые реализуют IList<T>
, таких как List<int>
, ObservableCollection<double>
и т. Д., Так что очевидно IList<>
нельзя назначить с List<>
. Опять же, не то, что я ожидал.
Как мне написать ISGenericList и заставить его работать, как в приведенных выше примерах?