Я хочу написать метод, который использует Reflection, чтобы указать, реализует ли данный тип IList<T>
. Например:Как определить, реализует ли тип IList <>?
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
В моем использовании, я могу предположить, что этот тип всегда будет создан экземпляр универсального типа (или то, что не общий на всех).
К сожалению, это не так просто, как должно быть. Очевидное решение:
не работает; он всегда возвращает 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);
}
т.е. превратить type
в его не-инстанцирован родовое, как IList<int>
->IList<>
, а затем попробовать снова IsAssignableFrom. Это возвращает истину, если типа является экземпляр IList<T>
, такими как IList<int>
, IList<object>
и т.д. Но это возвращает ложь для классов, которые реализуют IList<T>
таких как List<int>
, ObservableCollection<double>
и т.д., поэтому очевидно IList<>
не назначаемая из List<>
. Опять же, не то, что я ожидал бы.
Как я могу написать IsGenericList и заставить его работать так же, как в приведенных выше примерах?
+1 - Это работает, и это единственное решение, которое сейчас существует - я только понял, что у вас это было после того, как я опубликовал то же самое. –
Никогда не видел @ использовать ключевые слова как имена переменных в любом производственном коде. – VVS
Хорошее решение. :) Небольшая точка, однако: использование символов @ обычно не рекомендуется. (Вы можете просто вызвать переменную 'i' или' curInterface' вместо этого, чтобы разрешить конфликт имен.) – Noldorin