Değişkenin türünün bir değişkende depolanan Türle eşleşip eşleşmediğini kontrol etme


97
User u = new User();
Type t = typeof(User);

u is User -> returns true

u is t -> compilation error

Bazı değişkenlerin bu şekilde bir tür olup olmadığını nasıl test ederim?

Yanıtlar:


197

Diğer cevapların tümü önemli eksiklikler içermektedir.

isOperatör yok değil operandin zamanı tür olup olmadığını kontrol tam olarak verilmiş tipi; bunun yerine, çalışma zamanı türünün verilen türle uyumlu olup olmadığını kontrol eder :

class Animal {}
class Tiger : Animal {}
...
object x = new Tiger();
bool b1 = x is Tiger; // true
bool b2 = x is Animal; // true also! Every tiger is an animal.

Ancak yansıma ile tür kimliğini kontrol etmek uyumluluk için değil, kimlik için kontroller

bool b5 = x.GetType() == typeof(Tiger); // true
bool b6 = x.GetType() == typeof(Animal); // false! even though x is an animal

or with the type variable
bool b7 = t == typeof(Tiger); // true
bool b8 = t == typeof(Animal); // false! even though x is an 

İstediğiniz bu değilse, muhtemelen IsAssignableFrom'u istiyorsunuz:

bool b9 = typeof(Tiger).IsAssignableFrom(x.GetType()); // true
bool b10 = typeof(Animal).IsAssignableFrom(x.GetType()); // true! A variable of type Animal may be assigned a Tiger.

or with the type variable
bool b11 = t.IsAssignableFrom(x.GetType()); // true
bool b12 = t.IsAssignableFrom(x.GetType()); // true! A 

4
Burada gösterilen son yaklaşım işe yarasa da gereksiz yere ayrıntılıdır. typeof(Animal).IsInstanceOfType(x)olduğundan daha kısadır ve daha basittir typeof(Animal).IsAssignableFrom(x.GetType());(ve eğer ikincisini kullanırsanız Resharper ilkini kullanmanızı önerir).
Mark Amery

AÇIKLAMA: yerine, özgün soruyu cevaplamak için tiçin typeof(Animal). Böylece Mark'ın geliştirilmiş formu olur t.IsInstanceOfType(x).
ToolmakerSteve

13

GetType()her bir çerçeve türünde bulunur, çünkü temel objecttürde tanımlanır . Dolayısıyla, türün kendisinden bağımsız olarak, temelini döndürmek için kullanabilirsiniz.Type

Yani yapmanız gereken tek şey:

u.GetType() == t

1
Aslında Eric'in cevabı yararlıdır ve hepsi, ancak asıl soruda açıklanan "u is t" biçiminde bilinmeyen bir türle nasıl test yapılacağına ilişkin asıl soruyu yanıtlamaz ve sizinki yanıtlar.
Daniel

@Daniel - Tam olarak değil. Dave'in cevabı sadece t'nin alt sınıflarını dışlamak istiyorsanız doğrudur . Eric'in cevabı çoğunlukla ne yapılacağını açıklıyor; sadece "t" nin nereye koyulacağına dair bir açıklama eksik. Oraya bir yorum ekleyeceğim.
ToolmakerSteve

10

Örneğinizin Türünün sınıfın Türüne eşit olup olmadığını görmeniz gerekir. GetType()Yöntemi kullandığınız örneğin türünü almak için :

 u.GetType().Equals(t);

veya

 u.GetType.Equals(typeof(User));

yapmalı. Açıkçası, isterseniz karşılaştırmanızı yapmak için '==' kullanabilirsiniz.


+1 Ancak ikinci seçimi tercih edin. u.GetType.Equals(typeof(User));
Omar

Bunun == - kullanmaktan daha az güvenli olmasının bir nedeni, GetType () bir şekilde null döndürürse - atacağıdır.
Dave Bish

1
@Fuex, evet, bence typeof satır içi ise kodu okumayı kolaylaştırıyor, bu yüzden OPs örneğinde zaten ttürü içeren bir değişkene sahip olmasına rağmen onu böyle gönderdim .
Sam Holder

@DaveBish GetType boş döndüyse, pek çok şeyin fırlatmaya başlayacağından endişelenirdim ... ama puan alındı, tabii ki haklısın
Sam Holder

@SamHolder Evet - Bunun olabileceği tek durum, birinin temel türü geçersiz kılması ve bir şekilde uygulamayı bozması olabilir. Elbette tuhaf olurdu.
Dave Bish

4

Bir nesnenin belirli bir tür değişkenle uyumlu olup olmadığını kontrol etmek için, yazmak yerine

u is t

yazmalısın

typeof(t).IsInstanceOfType(u)

1
Daha ayrıntılı sözdiziminin 'u t' sözdizimine göre faydası nedir?
Kyle Humfeld

@KyleHumfeld Eğer Type foo olsaydı; Nesne A; "A is foo" yazamazsınız, ancak foo.isInstanceOfType (A) yazabilirsiniz
Timur Nuriyasov
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.