Я хочу написать метод, который использует 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<>
, не реализуют IsAssignable. Я ожидал, что они будут такими: IList<>
не может быть назначен из List<T>
.
Я также пробовал это:
public bool IsGenericList(Type type)
{
if (!type.IsGenericType)
return false;
var genericTypeDefinition = type.GetGenericTypeDefinition();
return typeof(List<>).IsAssignableFrom(genericTypeDefinition);
}
I.e., превратите type
в его неинтерминированный родословный, например IList<int>
→ IList<>
, а затем снова попробуйте IsAssignableFrom. Это вернет true, если тип - это экземпляр IList<T>
, такой как IList<int>
, IList<object>
и т.д. Но он возвращает false для классов, реализующих IList<T>
, таких как List<int>
, ObservableCollection<double>
и т.д., Поэтому, по-видимому, IList<>
не присваивается из List<>
. Опять же, не то, что я ожидаю.
Как мне начать писать IsGenericList и заставить его работать так же, как в приведенных выше примерах?