2010-11-26 19 views
31

Hallo, ich muss wissen, wie man das Objekt des gleichen Typs in C# überprüft.Überprüfen, ob das Objekt vom selben Typ ist


Szenario:

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: Bitte überdenken Sie diese Art von Design. Entweder arbeitet Ihre Methode mit dem Typ "Base_Data" oder sie arbeitet mit den Unterklassen "Person" und "Phone". Wenn es mit 'CheckObject' wirklich unterschiedliche Dinge gibt, warum sollte man nicht einfach die Methode überladen und separate' CheckObject (Phone phone) 'und' CheckObject (Person person) 'Methoden verwenden? Es ist nicht viel mehr Code und Sie bekommen etwas Kompilierzeit, die überprüft, dass die Base_Data-Unterklasse, die Sie zu "CheckObject" übergeben, von "CheckObject" unterstützt wird. – mlibby

Antwort

57

könnten Sie verwenden den is Betreiber:

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

Eine andere Möglichkeit ist es, die as Operator zu verwenden:

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

sollte eine Ausnahme geworfen werden im zweiten Beispiel ist falsch? und wenn ja von welcher Art? – jth41

+0

@ jth41 für dieses Verhalten, verwenden Sie einfach die regulären Besetzung ('Person Person = (Person) Daten;') anstelle der Safe Cast. – ANeves

18

Es genau hängt davon ab, was Sie bin danach. Mit is oder as (wie in Darin's Antwort gezeigt) wird Ihnen sagen, ob data auf eine Instanz von Personoder einen Subtyp verweist. Das ist die gebräuchlichste Form (wenn Sie jedoch Design entwickeln können, ohne es zu brauchen, wäre das sogar noch besser) - und wenn Sie das brauchen, ist Darins Antwort der zu verwendende Ansatz.

Wenn Sie jedoch brauchen ein genaues Spiel - wenn Sie nicht die besonderen Maßnahmen ergreifen wollen, wenn data auf eine Instanz einer Klasse von Person abgeleitet beziehen, nur für Person selbst, werden Sie wie etwas brauchen dies:

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

Dies ist relativ selten - und es ist definitiv wert, Ihr Design an dieser Stelle in Frage zu stellen.

6

Lassen Sie uns diesen einen Schritt nach dem anderen beheben. Der erste Schritt ist erforderlich, die nächsten beiden sind optional, werden aber vorgeschlagen.

Die erste Korrektur (die erforderlich ist) stellt sicher, dass Sie nicht ein Objekt eines Typs mit einem Objekt vom Typ System.Type Vergleich:

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)! 

Zweitens vereinfacht diese zu:

if (data is Person) ... // this has (almost) the same meaning as the above; 
         // in your case, it's what you need. 

Drittens erhalten die insgesamtif Aussage los! Dies geschieht durch Anwendung von Polymorphismus (oder, genauer gesagt, Verfahrensüberschreibung), z. wie folgt:

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(); 
    } 
} 

wie Sie durch den Bedingungscode zu sehen, hat mich in ein Check Verfahren der Base_Data Klasse und ihre abgeleiteten Klasse Person verschoben. Eine solche Typprüfung entfällt if!

Verwandte Themen