Как определить, наследуется ли данный тип (System.Type) от определенного базового класса (в .Net)?
-
02-07-2019 - |
Вопрос
Вероятно, это будет простой ответ, и я просто что-то упускаю, но вот... Если у меня есть тип (то есть настоящий System.Type... не экземпляр), как мне узнать, есть ли он наследуется от другого конкретного базового типа?
Решение
Использовать IsSubclassOf метод Тип системы сорт.
Другие советы
Одна вещь, которую нужно прояснить между Type.IsSubTypeOf()
и Type.IsAssignableFrom()
:
IsSubType()
вернетсяtrue
Только если заданный тип получен из указанного типа.Оно вернетсяfalse
если данный тип ЯВЛЯЕТСЯуказанный тип.IsAssignableFrom()
вернетсяtrue
Если заданный тип является либо указанным типом, либо получен из указанного типа.
Итак, если вы используете их для сравнения BaseClass
и DerivedClass
(который наследуется от BaseClass
) затем:
BaseClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = FALSE
BaseClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE
DerivedClassInstance.GetType.IsSubTypeOf(GetType(BaseClass)) = TRUE
DerivedClassInstance.GetType.IsAssignableFrom(GetType(BaseClass)) = TRUE
РЕДАКТИРОВАТЬ:Обратите внимание, что приведенное выше решение не удастся, если базовый тип, который вы ищете, является интерфейсом.Следующее решение будет работать для любого типа наследования, будь то класс или интерфейс.
// Returns true if "type" inherits from "baseType"
public static bool Inherits(Type type, Type baseType) {
return baseType.IsAssignableFrom(type)
}
(Полу)Полезный отрывок из MSDN статья:
true, если [аргумент] и текущий Тип представляют один и тот же тип, или если текущий Тип находится в иерархии наследования [аргумента], или если текущий Тип является интерфейсом, который реализует [аргумент], или если [аргумент] аргумент] — это параметр универсального типа, а текущий тип представляет собой одно из ограничений [аргумента].false, если ни одно из этих условий не является истинным или если [аргумент] является пустой ссылкой (Nothing в Visual Basic).