Как определить, наследуется ли данный тип (System.Type) от определенного базового класса (в .Net)?

StackOverflow https://stackoverflow.com/questions/129277

Вопрос

Вероятно, это будет простой ответ, и я просто что-то упускаю, но вот... Если у меня есть тип (то есть настоящий 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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top