Türler nasıl karşılaştırılır


130

Hızlı soru: bir Type türü (punto amaçlanmamıştır) C # 'da başka bir türle nasıl karşılaştırılır? Yani, bir ettik Type typeFieldve onu olup olmadığını bilmek istiyorum System.String, System.DateTimevb, ancak typeField.Equals(System.String)çalışma yapmaz.

Bir ipucu?

Yanıtlar:


180

Takip etmeyi dene

typeField == typeof(string)
typeField == typeof(DateTime)

typeofC # operatör size verecektir Typeadında türü için nesne. Typeörnekler ==operatörle karşılaştırılabilir, bu nedenle bunları karşılaştırmak için iyi bir yöntemdir.

Not: Doğru hatırlıyorsam, ilgili türler derlemelere (NoPIA aracılığıyla) gömülü COM arabirimleri olduğunda bunun bozulduğu bazı durumlar vardır. Buradaki durum böyle görünmüyor.


76

Bunun için is operatörü kullanabilirsiniz . Ardından, nesnenin belirli bir tür olup olmadığını yazarak kontrol edebilirsiniz:

if (myObject is string)
{
  DoSomething()
}

3
Bizim için "is" veya "typeof" daha mı iyi?
Brent Wagoner

32

Aşağıdakileri kullanarak tam olarak aynı tür için karşılaştırma yapabilirsiniz:

class A {
}
var a = new A();
var typeOfa = a.GetType();
if (typeOfa == typeof(A)) {
}

typeof, belirli bir sınıftan Type nesnesini döndürür.

Ancak A'dan miras alan bir B türünüz varsa, bu karşılaştırma yanlıştır. Ve IsAssignableFrom'u arıyorsunuz .

class B : A {
}
var b = new B();
var typeOfb = b.GetType();

if (typeOfb == typeof(A)) { // false
}

if (typeof(A).IsAssignableFrom(typeOfb)) { // true
}

7

Örneğiniz bir Type:

Type typeFiled;
if (typeField == typeof(string))
{ 
    ... 
}

ancak örneğiniz bir objectve bir Typekullanım değilse , asoperatörü kullanın :

object value;
string text = value as string;
if (text != null)
{
    // value is a string and you can do your work here
}

bunun valueyalnızca bir kez belirtilen türe dönüştürme avantajı vardır .


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.