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

Это, вероятно, будет простой ответ, и я просто что-то упускаю, но здесь идет ... Если у меня есть тип, (то есть, фактический System.Type ... не экземпляр), как сделать Я скажу, если он наследует от другого конкретного базового типа?

Ответы [ 3 ]

32 голосов
/ 24 сентября 2008

Используйте метод IsSubclassOf класса System.Type .

23 голосов
/ 30 января 2009

Одна вещь, которую нужно уточнить между Type.IsSubTypeOf() и Type.IsAssignableFrom():

  • IsSubType() вернет true, только если данный тип получен из указанный тип. Он вернет false, если данный тип IS указанный тип.

  • 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
22 голосов
/ 24 сентября 2008

РЕДАКТИРОВАТЬ: обратите внимание, что вышеприведенное решение не будет работать, если базовый тип, который вы ищете, является интерфейсом. Следующее решение будет работать для любого типа наследования, будь то класс или интерфейс.

// Returns true if "type" inherits from "baseType"
public static bool Inherits(Type type, Type baseType) {
    return baseType.IsAssignableFrom(type)
}

(полу) Полезная выдержка из статьи MSDN :

true, если [аргумент] и текущий тип представляют один и тот же тип, или если текущий тип находится в иерархии наследования [аргумента], или если текущий тип является интерфейсом, который реализует [аргумент], или if [аргумент] является параметром универсального типа, а текущий тип представляет одно из ограничений [аргумента]. false, если ни одно из этих условий не выполняется или если [аргумент] является пустой ссылкой (ничего в Visual Basic).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...