Я хочу написать метод, который использует 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 и заставить его работать так же, как в приведенных выше примерах?