Arreglemos esto un paso a la vez. El primer paso es obligatorio, los siguientes dos son opcionales pero sugeridos.
La primera corrección (que se requiere) se asegura de que no se está comparando un objeto de algún tipo con un objeto de tipo 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)!
En segundo lugar, simplificar este a:
if (data is Person) ... // this has (almost) the same meaning as the above;
// in your case, it's what you need.
En tercer lugar, deshacerse de la if
comunicado conjunto! Esto se hace empleando polimorfismo (o, más precisamente, anulación de método), p. de la siguiente manera:
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();
}
}
Como se ve, el código condicional se ha desplazado en un método de la clase Base_Data
Check
y su clase derivada Person
. No más necesidad de tal declaración de verificación de tipo if
!
En mi humilde opinión: reconsidere este tipo de diseño. O bien su método funciona con el tipo 'Base_Data' o funciona con las subclases,' Persona' y 'Teléfono'. Si hay cosas realmente diferentes que suceden con 'CheckObject', ¿por qué no simplemente sobrecargar el método y tener métodos separados' CheckObject (Phone phone) 'y' CheckObject (Person person) '? No es mucho más código y obtienes un tiempo de compilación comprobando que la subopción 'Base_Data' que estás pasando a' CheckObject' es compatible con 'CheckObject'. – mlibby