Подтвердить что ты не робот

С# проверка для точного типа

Я хочу проверить тип объекта. Я только хочу вернуть true, если тип точно такой же. Унаследованные классы должны возвращать false.

например:

class A {}
class B : A {}

B b = new B();

// The next line will return true, 
// but I am looking for an expression that returns false here
if(b is A) 
4b9b3361

Ответ 1

b.GetType() == typeof(A)

Ответ 2

(b is A) проверяет b на совместимость типов с A, что означает, что он проверяет иерархию наследования b и реализованные интерфейсы для типа A.

b.GetType() == typeof(A), с другой стороны, проверяет точный тот же тип. Если вы еще не квалифицируете типы далее (то есть кастинг), вы проверяете объявленный тип b.

В любом случае (используя любой из приведенных выше) вы получите true, если b - точный тип A.

Будьте осторожны, чтобы узнать, почему вы хотите использовать точные типы в одной ситуации над другой:

  • Например, чтобы проверить точные типы, вы поразите цель полиморфизма OO, которую вы, возможно, не пожелаете в конечном итоге сделать.
  • Однако, например, если вы реализуете специализированный шаблон разработки программного обеспечения, такой как Inversion of Control IoC, то вы иногда захотите работать с точными типами.

Edit:

В вашем примере

if(b is A) // this should return false

превратите его в точную декларированную проверку типа, используя:

if (b.GetType() == typeof(A))

Ответ 3

использование:

if (b.GetType() == typeof(A)) // this returns false

Ответ 4

Ваш образец кода кажется противоположным вашему вопросу.

bool isExactTypeOrInherited = b is A;
bool isExactType = b.GetType() == a.GetType();

Ответ 5

bool IsSameType(object o, Type t) {
  return o.GetType() == t;
}

Затем вы можете вызвать метод следующим образом:

IsSameType(b, typeof(A));

Ответ 6

Пожалуйста, используйте функцию Поиск, прежде чем задавать новый вопрос.

На этот вопрос уже был дан ответ:

Проверьте, являются ли типы литыми/подклассами

и сделать обратное - вернуть false, если тип является подклассом.

EDIT: Другой связанный с этим вопрос: Тип Проверка: typeof, GetType или есть?