Chcę napisać metodę wykorzystującą odbicie, aby stwierdzić, czy dany typ implementuje IList<T>
. Na przykład:Jak stwierdzić, czy typ implementuje 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
W moim użytkowania, mogę założyć, że typ zawsze będzie instancję typu rodzajowego (lub coś, co nie jest nazwą rodzajową w ogóle).
Niestety, nie jest to takie proste, jak powinno być. Oczywiste rozwiązanie:
public bool IsGenericList(Type type)
{
return typeof(IList<>).IsAssignableFrom(type);
}
nie działa; zawsze zwraca wartość false. Pozornie niestanowiące instancji typy ogólne, takie jak IList<>
, nie implementują IsAssignableFrom w sposób, w jaki ich oczekuję: IList<>
nie można przypisać z poziomu.
Próbowałem to również:
public bool IsGenericList(Type type)
{
if (!type.IsGenericType)
return false;
var genericTypeDefinition = type.GetGenericTypeDefinition();
return typeof(List<>).IsAssignableFrom(genericTypeDefinition);
}
Tj skręcić type
do jej wystąpienia non-generic, jak IList<int>
->IList<>
, a następnie spróbuj ponownie IsAssignableFrom. Że zwróci true, gdy typ jest instancja IList<T>
takich jak IList<int>
, IList<object>
itp ale zwraca false dla klas, które implementują IList<T>
takich jak List<int>
, ObservableCollection<double>
itp, więc widocznie IList<>
nie jest przypisane z List<>
. Ponownie, nie to, co bym się spodziewał.
Jak mam napisać IsGenericList i jak działa to w powyższych przykładach?
+1 - Działa to i jest jedynym rozwiązaniem, które obecnie ma miejsce - po prostu zdałem sobie sprawę, że masz to po tym, jak napisałem to samo. –
Nigdy nie widziałem @ do używania słów kluczowych jako nazw zmiennych w każdym kodzie produkcyjnym. – VVS
Dobre rozwiązanie. :) Mały punkt jednak: używanie symboli @ nie jest ogólnie zalecane. (Zamiast tego możesz wywołać zmienną 'i' lub' curInterface', aby rozwiązać konflikt nazwy.) – Noldorin