Как я проверяю, является ли тип подтипом ИЛИ типом объекта?

Чтобы проверить, является ли тип подклассом другого типа в C#, это легко:

typeof (SubClass).IsSubclassOf(typeof (BaseClass)); // returns true

Однако это перестанет работать:

typeof (BaseClass).IsSubclassOf(typeof (BaseClass)); // returns false

Есть ли любой способ проверить, является ли тип или подклассом ИЛИ самого базового класса, не используя OR оператор или использование дополнительного метода?

320
задан abatishchev 4 March 2016 в 09:36
поделиться

3 ответа

По-видимому, нет.

Вот варианты:

Type.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

Это означает, что Производный является подклассом 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

Последний Истинный будет указывать, если метод только ответил на заданный вопрос, что uint [] наследуется от int [] или что они одного типа, что явно не так.

Так что IsAssignableFrom тоже не совсем корректный.

равно и как

«Проблема» с - и как в контексте вашего вопроса в том, что они потребуют от вас действий объекты и пишут один из типов непосредственно в коде и не работают с объектами 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;
}
473
ответ дан 23 November 2019 в 00:58
поделиться
typeof(BaseClass).IsAssignableFrom(unknownType);
34
ответ дан 23 November 2019 в 00:58
поделиться

Вы должны попробовать использовать Type.IsAssignableFrom вместо этого.

11
ответ дан 23 November 2019 в 00:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: