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

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

Ответы

Ответ 2

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

// 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).

Ответ 3

Одна вещь, чтобы уточнить между 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