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

Проверка того, является ли объект одного и того же типа

Здравствуйте, мне нужно знать, как проверить, является ли объект того же типа в С#.

Сценарий:

class Base_Data{}

class Person : Base_Data {}
class Phone : Base_data {}

class AnotherClass{

   public void CheckObject(Base_Data data){
         if(data.Equals(Person.GetType())){ //<-- Visual Studio 2010 gives me error, says that I am using 'Person' is a type and not a variable.

       }
    }
}
4b9b3361

Ответ 1

Вы можете использовать оператор is:

if (data is Person)
{
    // data is an instance of Person
}

Другая возможность заключается в использовании оператора as:

Person person = data as Person;
if (person != null)
{
    // safely use person here
}

Ответ 2

Это зависит от того, что вы после. Используя is или as (как показано в ответе Дарина), вы скажете, если data ссылается на экземпляр Person или подтип. Это самая распространенная форма (хотя, если вы можете проектировать ее не нужно, это было бы еще лучше), и если это то, что вам нужно, Дарин отвечает за подход.

Однако, если вам нужно точное совпадение - если вы не хотите принимать конкретное действие, если data ссылается на экземпляр некоторого класса, полученного из Person, только для Person, вы будете нужно что-то вроде этого:

if (data.GetType() == typeof(Person))

Это относительно редко - и это определенно стоит поставить под сомнение ваш дизайн на этом этапе.

Ответ 3

Позвольте исправить этот шаг за раз. Первый шаг необходим, следующие два являются необязательными, но предлагаются.

Первая коррекция (которая требуется) гарантирует, что вы не сравниваете объект какого-либо типа с объектом типа System.Type:

if (data.GetType().Equals(typeof(Person))) ...
//      ^^^^^^^^^^
//      add this to make sure you're comparing Type against Type, not
//      Base_Data against Type (which caused the type-check error)!

Во-вторых, упростите это до:

if (data is Person) ... // this has (almost) the same meaning as the above;
                        // in your case, it what you need.

В-третьих, избавиться от оператора if вообще! Это делается с использованием полиморфизма (или, точнее, переопределения метода), например. следующим образом:

class Base_Data
{
    public virtual void Check() { ... }
}

class Person : Base_Data
{
    public override void Check()
    {
        ... // <-- do whatever you would have done inside the if block
    }
}

class AnotherClass
{
    public void CheckData(Base_Data data)
    {
         data.Check();
    }
}

Как вы видите, условный код был смещен в метод Check класса Base_Data и его производный класс Person. Больше нет необходимости в выполнении такого типа проверки if!