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
Görünüşe göre, hayır.
İşte seçenekler:
- Type.IsSubclassOf kullanın
- Type.IsAssignableFrom kullanın
is
as
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;
}
Nasıl bir nesne JavaScript özelliği ol...
Nasıl bir tamsayı çift veya tek olup o...
Nasıl bir tablo var olup olmadığını SQ...
Nasıl PHP ilişkisel Dizi veya sıralı o...
Nasıl eğer fare bir WordPress kullanma...