2010-11-26 33 views
31

Merhaba C# ile aynı türde nesnenin nasıl kontrol edileceğini bilmem gerekiyor.
Nesnenin aynı türde olup olmadığını kontrol etme

Senaryo:

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

diğer olasılık as operatörü kullanmaktır::

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: Lütfen bu tasarım türünü tekrar gözden geçirin. Ya yönteminiz 'Base_Data' türüyle çalışır veya alt sınıflar, 'Kişi' ve 'Telefon' ile çalışır. 'CheckObject' ile gerçekten farklı şeyler oluyorsa, neden sadece yöntemi aşırı yüklemiyor ve' CheckObject (Phone phone) 've' CheckObject (Person person) 'yöntemlerini kullanıyorsunuz? Daha fazla kod değil ve "CheckObject" 'e geçtiğiniz 'Base_Data' alt sınıfının' CheckObject' tarafından desteklendiğini kontrol etmek için biraz derleme zamanı elde edersiniz. – mlibby

cevap

57

Sen is operatörünü kullanabilirsiniz Tam bağlıdır

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

ikinci örnekte bir istisna atılmalıdır yanlış mı? ve eğer türden ise?Bu davranış için – jth41

+0

@ jth41, sadece güvenli döküm yerine düzenli cast ('Kişi kişi = (Kişi) verileri;') kullanın. – ANeves

18

ne sonra tekrar.veya as'u (Darin'in yanıtında gösterildiği gibi) kullanarak, data'un Personveya alt türünün bir örneğine başvurup başvurmadığını söyleyecektir. Bu en yaygın biçimdir (buna ihtiyaç duymaktan uzaklaşabiliyor olsanız bile, bu daha da iyi olacaktır) - ve ihtiyacınız olan şey buysa, Darin'in cevabı kullanım yaklaşımıdır.

Ancak, bir tam maçı gerekiyorsa - data sadece Person kendisi gibi bir şey gerekir için, Person türetilen bazı sınıfının bir örneğine atıfta eğer belirli eylemde istemiyorsanız bu:

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

Bu, nispeten nadirdir ve kesinlikle bu noktada tasarımınızı sorgulamaya değer.

6

Bu adımı bir seferde düzeltebiliriz. İlk adım gereklidir, sonraki iki seçenek isteğe bağlıdır ancak önerilmektedir.

(gereklidir) birinci düzeltme türe System.Type bir nesne ile bazı tür bir nesnenin karşılaştıran değiliz emin olur:

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

İkinci, bu basitleştirmek:

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

Üçüncüsü, if açıklamada tamamen kurtul! Bu, polimorfizm (veya daha doğrusu, usul üstlenme usulü) örn. aşağıdaki gibi:

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

Görüldüğü gibi, koşullu kod Base_Data sınıfı Check yönteme kaydırılır ve bundan türetilmiş sınıf Person edilmiştir. Böyle bir tip kontrol if ifadesine gerek yok!

İlgili konular