SORU
30 NİSAN 2010, Cuma


C#, nasıl bir tip, bir alt VEYA bir nesne türü olup olmadığını kontrol edebilirim?

Eğer bir C tipi başka türde bir alt sınıfı olup olmadığını kontrol etmek için# kolay:

typeof (SubClass).IsSubclassOf(typeof (BaseClass)); // returns true

Ancak, bu başarısız olur:

typeof (BaseClass).IsSubclassOf(typeof (BaseClass)); // returns false

Bir tür ya da bir alt sınıf YA da temel sınıfın olup olmadığını kontrol etmek için herhangi bir şekilde kendisi, OR operatör kullanma ya da uzatma yöntemi kullanmadan var mı?

CEVAP
30 NİSAN 2010, Cuma


Görünüşe göre, hayır.

İşte seçenekler:

Yazın.İsSubclassOf

Zaten öğrenmiş olduğunuz gibi, bu iki tür gösterir: o, burada bir örnek LINQPad aynı program çalışmaz

void Main()
{
    typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
    typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}

public class Base { }
public class Derived : Base { }

Çıkış:

True
False

Derived Base, bir alt sınıfı olduğunu ama Base(belli ki) kendisi bir alt sınıfı değildir gösterir.

Yazın.İsAssignableFrom

Şimdi, özellikle bu soruna cevap olur, ama aynı zamanda yanlış pozitif sonuç verecektir. Eric Lippert dikkat çeken açıklamalarda, ise bu yöntem kesinlikle iade True yukarıdaki iki soru, aynı zamanda dönüş True Bu, muhtemelen istemiyorum:

void Main()
{
    typeof(Base).IsAssignableFrom(typeof(Derived)).Dump();
    typeof(Base).IsAssignableFrom(typeof(Base)).Dump();
    typeof(int[]).IsAssignableFrom(typeof(uint[])).Dump();
}

public class Base { }
public class Derived : Base { }

Burada aşağıdaki çıktıyı alıyorum:

True
True
True

True en son orada, yöntem olmadığını belirtmek istiyorumsadececevap sorun açık bir durum değildir uint[] int[] devralan veya aynı tür olduklarını sordu,,.

IsAssignableFrom tamamen doğru değil.

is as

Bu "sorun" ile is as bağlamında soru bu olacak iste ameliyat nesneleri ve yazmak bir tür doğrudan kod ve çalışması ile Type nesneler.

Diğer bir deyişle, bu derleme olmaz:

SubClass is BaseClass
^-- ---^
   |
    -- need object reference here

ne de bu

typeof(SubClass) is typeof(BaseClass)
                    ^------- -------^
                            |
                             -- need type name here, not Type object

ne de bu

typeof(SubClass) is BaseClass
^------ -------^
       |
        -- this returns a Type object, And "System.Type" does not
           inherit from BaseClass

Sonuç

Yukarıdaki yöntemlerden ihtiyaçlarınıza uygun olsa da, sorunuzu gördüğüm kadarıyla () sadece doğru cevabı ekstra bir kontrol gerekir

typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);

elbette bir yöntem daha mantıklı:

public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
    return potentialDescendant.IsSubclassOf(potentialBase)
           || potentialDescendant == potentialBase;
}

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Damien Walters

    Damien Walte

    20 AĞUSTOS 2006
  • Miles Fisher

    Miles Fisher

    8 NİSAN 2009
  • sebsebdouze

    sebsebdouze

    7 ŞUBAT 2008