Чтобы проверить, является ли тип подклассом другого типа в C#, это легко:
typeof (SubClass).IsSubclassOf(typeof (BaseClass)); // returns true
Однако это перестанет работать:
typeof (BaseClass).IsSubclassOf(typeof (BaseClass)); // returns false
Есть ли любой способ проверить, является ли тип или подклассом ИЛИ самого базового класса, не используя OR
оператор или использование дополнительного метода?
По-видимому, нет.
Вот варианты:
равно
и как
Как вы Как мы уже выяснили, это не сработает, если два типа совпадают, вот пример программы 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
(очевидно) не является подклассом самого себя.
Теперь это ответит на ваш конкретный вопрос, но также даст вам ложные срабатывания.Как отметил Эрик Липперт в комментариях, хотя метод действительно вернет 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;
}
Вы должны попробовать использовать Type.IsAssignableFrom вместо этого.