2010-11-26 11 views
31

Bonjour, j'ai besoin de savoir comment vérifier si l'objet du même type est en C#.
Vérifier si l'objet est du même type

Scénario:

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. 

     } 
    } 
} 
+0

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

Répondre

57

Vous pouvez utiliser l'opérateur is:

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

Une autre possibilité est d'utiliser l'opérateur as:

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

si une exception est levée dans le second exemple est faux? et si oui de quel genre? – jth41

+0

@ jth41 pour ce comportement, utilisez simplement la distribution standard ('Person person = (Person) data;') au lieu de la distribution sécurisée. – ANeves

18

Cela dépend exactement ce que vous sommes après. En utilisant is ou as (comme indiqué dans la réponse de Darin) vous dira si data fait référence à une instance de Personou d'un sous-type. C'est la forme la plus commune (bien que si vous pouvez concevoir loin d'en avoir besoin, ce serait encore mieux) - et si c'est ce dont vous avez besoin, la réponse de Darin est l'approche à utiliser.

Cependant, si vous avez besoin d'une correspondance exacte - si vous ne voulez pas prendre l'action particulière si data fait référence à une instance d'une classe dérivée de Person, seulement pour se Person, vous aurez besoin de quelque chose ceci:

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

Ceci est relativement rare - et cela vaut vraiment la peine d'interroger votre conception à ce stade.

6

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!