Мабуть, ні.
Ось варіанти:
Тип.IsSubclassOf
Як ви вже з’ясували, це не спрацює, якщо два типи однакові, ось приклад програми LINQPad, яка демонструє:
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
Вихід:
True
False
Що вказує, що Derivedце підклас Base, але Baseце (очевидно) не підклас сам по собі.
Type.IsAssignableFrom
Тепер це відповість на ваше конкретне запитання, але також дасть помилкові позитиви. Як в коментарях зазначив Ерік Ліпперт, хоча метод справді повернеться Trueза двома вищезазначеними питаннями, він також повернеться Trueза цими, чого ви, мабуть, не хочете:
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 { }
Тут ви отримуєте такий результат:
True
True
True
Останнє Trueтам вказувало б, якщо метод лише відповів на поставлене запитання, що він uint[]успадковує int[]або що вони одного типу, що, очевидно, не так.
Так IsAssignableFromсамо не зовсім коректно.
is і as
"Проблема" з вашим запитанням isі asв контексті вашого запитання полягає в тому, що вони вимагатимуть, щоб ви працювали над об'єктами і писали один із типів безпосередньо в коді, а не працювали з Typeоб'єктами.
Іншими словами, це не компілюється:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
і це не буде:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
і це не буде:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
Висновок
Хоча вищезазначені методи можуть відповідати вашим потребам, єдиний правильний відповідь на ваше запитання (як я бачу) полягає в тому, що вам знадобиться додаткова перевірка:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
що, звичайно, має більше сенсу в методі:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}