Проверка того, является ли объект одного и того же типа
Здравствуйте, мне нужно знать, как проверить, является ли объект того же типа в С#.
Сценарий:
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.
}
}
}
Ответы
Ответ 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
!