Örneğin bir tür olup olmadığını kontrol edin


181

cBir örneği olup olmadığını kontrol etmek için bunu kullanın TForm.

c.GetType().Name.CompareTo("TForm") == 0

stringParam olarak kullanmanın yanı sıra bunu yapmanın daha güvenli bir yolu var mı CompareTo()?


20
Umarım Java ile de böyle yapmazsınız. Java instanceofve C # 'lar isbunu yapmanın çok daha iyi yoludur.
Powerlord

Yanıtlar:


410

Buradaki farklı cevapların iki farklı anlamı vardır.

Bir örnek olup olmadığı kontrol etmek istediğiniz takdirde tam bir tip daha sonra

if (c.GetType() == typeof(TForm))

gitmek için bir yoldur.

Eğer olup olmadığını bilmek istiyorsanız cbir örneğidir TForm veya alt sınıf daha sonra kullanım is/ as:

if (c is TForm)

veya

TForm form = c as TForm;
if (form != null)

Bu davranışlardan hangisini gerçekten istediğinizi açıklamakta fayda var.


7
Küçük bir not: oyuncu kadrosunun sonucunu kullanmak istemiyorsanız "is" kullanın ve isterseniz "as" kullanın.
Aviram Fireberger

14
C # 7 ile birleştirebilirsiniz isve asdesen eşleşmesi ile:if (x is TForm tf) {…
Richard

39
if(c is TFrom)
{
   // Do Stuff
}

veya ca olarak kullanmayı planlıyorsanız TFormaşağıdaki örneği kullanın:

var tForm = c as TForm;
if(tForm != null)
{
   // c is of type TForm
}

İkinci örneğin yalnızca bir kez ctür olup olmadığını kontrol etmesi gerekir TForm. Burada tür olup olmadığını kontrol edip döküm yaparsanız c, TFormCLR ekstra kontrolden geçer. İşte bir referans .

Edit: Çalıntı Jon Skeet

Yapmak isterseniz emin ctaşımaktadır TFormve devralan herhangi sınıfı TForm, daha sonra kullanılmak

if(c.GetType() == typeof(TForm))
{
   // Do stuff cause c is of type TForm and nothing else
}


10

Ayrıca, bir şekilde aynı damarda

Type.IsAssignableFrom(Type c)

"C ve geçerli Tür aynı türü temsil ediyorsa veya geçerli Tür, c'nin miras hiyerarşisinde ise veya geçerli Tür, c'nin uyguladığı bir arabirim ise veya c, genel bir tür parametresi ve geçerli Tür ise c'nin kısıtlarından birini temsil eder. "

Buradan: http://msdn.microsoft.com/tr-tr/library/system.type.isassignablefrom.aspx


bu da benim kişisel favorim. typeof(Class).IsAssignableFrom(object.getType())Java instanceofoperatörüne benzer .
SkidRunner

Kalıtım hiyerarşisinin aynı dalında değilse, ancak bir dönüşüm operatörü varsa yanlış verir mi?
Paul Stelian

İyi soru @PaulStelian. Kafamın üstünden emin değilim ama tahminim bu durumda yanlış bir geri dönecekti. En azından benim beklenen davranışım bu olurdu. Örtük bir dönüşüm varsa, bu doğru olabilir, ancak bu garip olacaktır.
Brad Cunningham

Denemek için Visual Studio yüklenmiş olan var mı?
Paul Stelian

1
@PaulStelian - yanlış döndürür. Bu, doc bağlantısını izleyerek ve dönüşümlerden bahsedilmediğini gözlemleyerek görülebilir. Bunu düşünmek için başka bir yolu, yani T1.IsAssignableFrom(T2)döner truedurumlarda nerede asoperatör döner boş olmayan bir değeri, bu tür örnekleri verilen.
ToolmakerSteve

9

TForm olarak c kullanmak istiyorsanız, diğer cevaplardan biraz daha kompakt:

if(c is TForm form){
    form.DoStuff();
}


2

Diğerlerinin de belirttiği gibi, "is" anahtar kelimesi. Ancak, daha sonra bu tür bir döküm yapacaksanız, örn.

TForm t = (TForm)c;

Sonra "as" anahtar sözcüğünü kullanmalısınız.

Örneğin TForm t = c as TForm.

Sonra kontrol edebilirsiniz

if(t != null)
{
 // put TForm specific stuff here
}

İle birleştirmeyin çünkü bu yinelenen bir kontroldür.



-1
bool isValid = c.GetType() == typeof(TForm) ? true : false;

veya daha basit

bool isValid = c.GetType() == typeof(TForm);

IMHO: Doğrudan merhametten kaçınırdım (yani. ==). Belirli bir Türünüzün örneğin bir sealedSınıftan devralınmayacağını bilmediğiniz sürece mirası destekleyen nesne veya yönlendirilmiş dillerde . Ayrıca: (statik / sabit) boole değerleri döndüren üçlü bir operatörün kullanımı beni rahatsız ediyor, bir switchifade olsaydı daha az rahatsız olurdum .
SkidRunner
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.