Résoutons ceci une étape à la fois. La première étape est requise, les deux suivantes sont optionnelles mais suggérées.
La première correction (ce qui est nécessaire) fait en sorte que vous n'êtes pas comparer un objet d'un certain type avec un objet de type 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)!
Deuxièmement, simplifier à:
if (data is Person) ... // this has (almost) the same meaning as the above;
// in your case, it's what you need.
Troisièmement, se débarrasser de la déclaration if
tout à fait! Ceci est fait en utilisant un polymorphisme (ou, plus précisément, un dépassement de méthode), par ex. comme suit:
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();
}
}
Comme vous le voyez, le code conditionnel a été déplacé dans une méthode Check
de la classe Base_Data
et sa classe dérivée Person
. Plus besoin d'une telle vérification de type if
!
IMHO: s'il vous plaît reconsidérer ce type de conception. Soit votre méthode fonctionne avec le type 'Base_Data', soit elle fonctionne avec les sous-classes' Person' et 'Phone'. Si des choses vraiment différentes se produisent avec 'CheckObject', pourquoi ne pas surcharger la méthode et avoir des méthodes distinctes 'CheckObject (Phone phone)' et 'CheckObject (Person person)'? Ce n'est pas beaucoup plus de code et vous obtenez un peu de temps de compilation en vérifiant que la sous-classe 'Base_Data' que vous passez à' CheckObject' est supportée par 'CheckObject'. – mlibby