Проверка, если объект того же типа - PullRequest
46 голосов
/ 26 ноября 2010

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

Сценарий:

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.

        }
    }
}

Ответы [ 3 ]

82 голосов
/ 26 ноября 2010

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

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

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

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

Или, начиная с C # 7, используйте форму сопоставления с шаблоном оператора is , которая объединяет два вышеупомянутых:

if (data is Person person)
{
    // `data` is an instance of Person,
    // and you can use it as such through `person`.
}
24 голосов
/ 26 ноября 2010

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

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

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

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

9 голосов
/ 26 ноября 2010

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

Первое исправление (которое требуется) гарантирует, что вы не сравниваете объект какого-либо типа с объектом типа 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's 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!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...