Мабуть, ні.
Ось варіанти:
Тип.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;
}