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 Derivedjest to podklasa Base, ale nie Basejest (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 Truedo dwóch powyższych pytań, ale wróci również Truedo 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 Truewskazywał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ż IsAssignableFromnie jest do końca poprawne.
is i as
„Problem” z isi asw 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 Typeobiektami.
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;
}