Najwyraźniej nie.
Oto opcje:
Type.IsSubclassOf
Jak już się dowiedziałeś, to nie zadziała, jeśli oba typy są takie same, oto przykładowy program LINQPad , który pokazuje:
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
Wynik:
True
False
Co wskazuje, że Derived
jest to podklasa Base
, ale nie Base
jest (oczywiście) sama w sobie podklasą.
Type.IsAssignableFrom
To odpowie na twoje konkretne pytanie, ale da ci również fałszywe pozytywne wyniki. Jak zauważył Eric Lippert w komentarzach, metoda rzeczywiście powróci True
do dwóch powyższych pytań, ale wróci również True
do tych, których prawdopodobnie nie chcesz:
void Main()
{
typeof(Base).IsAssignableFrom(typeof(Derived)).Dump();
typeof(Base).IsAssignableFrom(typeof(Base)).Dump();
typeof(int[]).IsAssignableFrom(typeof(uint[])).Dump();
}
public class Base { }
public class Derived : Base { }
Tutaj otrzymujesz następujące dane wyjściowe:
True
True
True
Ostatni True
wskazywałby, gdyby metoda odpowiedziała tylko na zadane pytanie, że uint[]
dziedziczy int[]
lub jest tego samego typu, co oczywiście nie jest prawdą.
To też IsAssignableFrom
nie jest do końca poprawne.
is
i as
„Problem” z is
i as
w związku z pytaniem jest to, że wymagają one, aby działać na obiektach i napisać jeden z typów bezpośrednio w kodzie, a nie pracy z Type
obiektami.
Innymi słowy, to się nie skompiluje:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
nie będzie to również:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
nie będzie to również:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
Wniosek
Chociaż powyższe metody mogą pasować do twoich potrzeb, jedyną prawidłową odpowiedzią na twoje pytanie (jak widzę) jest to, że będziesz potrzebować dodatkowej kontroli:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
co oczywiście ma większy sens w metodzie:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}
IsInstanceOfType
pasowało?źródło
Zamiast tego powinieneś spróbować użyć Type.IsAssignableFrom .
źródło
Jeśli próbujesz to zrobić w projekcie PCL Xamarin Forms, powyższe rozwiązania używają
IsAssignableFrom
błędu:ponieważ
IsAssignableFrom
prosi oTypeInfo
obiekt. Możesz użyćGetTypeInfo()
metody zSystem.Reflection
:typeof(BaseClass).GetTypeInfo().IsAssignableFrom(typeof(unknownType).GetTypeInfo())
źródło
Publikuję tę odpowiedź z nadzieją, że ktoś się ze mną podzieli, czy i dlaczego byłby to zły pomysł. W mojej aplikacji mam właściwość Type, którą chcę sprawdzić, aby upewnić się, że jest to typeof (A) lub typeof (B), gdzie B to dowolna klasa wywodząca się z A. Więc mój kod:
Wydaje mi się, że jestem tu trochę naiwny, więc wszelkie opinie będą mile widziane.
źródło