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;
}