Chciałbym przeprowadzić test, jeśli obiekt jest typu ogólnego. Próbowałem następujących bez powodzenia:
public bool Test()
{
List<int> list = new List<int>();
return list.GetType() == typeof(List<>);
}
Co robię źle i jak mam wykonać ten test?
Zakładam, że nie chcesz tylko wiedzieć, czy typ jest ogólny, ale jeśli obiekt jest wystąpieniem określonego typu ogólnego, bez znajomości argumentów typu.
Niestety nie jest to strasznie proste. Nie jest źle, jeśli typ generyczny jest klasą (tak jak w tym przypadku), ale jest to trudniejsze w przypadku interfejsów. Oto kod zajęć:
EDYCJA: Jak zauważono w komentarzach, może to działać w przypadku interfejsów:
Podejrzewam, że mogą być wokół tego jakieś niezręczne skrajne przypadki, ale nie mogę znaleźć takiego, który na razie zawodzi.
źródło
List<T>
w takiej czy innej formie. Jeśli dołączysz interfejsy, jest to naprawdę trudne.IsInstanceOfGenericType
na wywołanieIsAssignableFrom
zamiast operatora równości (==
)?Możesz użyć krótszego kodu, używając dynamicznego, chociaż może to być wolniejsze niż czyste odbicie:
źródło
Oto moje dwie ulubione metody rozszerzeń, które obejmują większość przypadków skrajnych sprawdzania typów ogólnych:
Pracuje z:
Ma przeciążenie, które `` wyłączy '' określony typ ogólny, jeśli zwróci wartość true (zobacz test jednostkowy dla próbek):
Oto test demonstrujący (podstawową) funkcjonalność:
źródło
źródło