Görünüşe göre, hayır.
Seçenekler şunlardır:
Type.IsSubclassOf
Daha önce de bildiğiniz gibi, iki tür aynı ise bu çalışmaz, işte size gösteren örnek bir LINQPad programı:
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
Çıktı:
True
False
Bu, bunun Derived
bir alt sınıfı olduğunu Base
, ancak Base
(tabii ki) kendi alt sınıfı olmadığını gösterir.
Type.IsAssignableFrom
Şimdi, bu sizin özel sorunuza cevap verecektir, ancak size yanlış pozitifler de verecektir. Eric Lippert'in yorumlarda belirttiği gibi, yöntem gerçekten de True
yukarıdaki iki soru True
için geri dönerken , muhtemelen istemediğiniz bunlar için de geri dönecektir :
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ı elde edersiniz:
True
True
True
Sonuncusu True
, eğer yöntem sadece sorulan soruya cevap verdiyse , ondan uint[]
miras kaldığını int[]
veya aynı tipte olduklarını gösterir, ki bu açıkça değil.
Bu IsAssignableFrom
da tamamen doğru değil.
is
ve as
"Sorun" is
ve as
sorunuzun bağlamında onlar nesneler üzerinde işlem ve doğrudan kodda türlerinden birini değil, eser yazmak için gerektirecektir olmasıdır Type
nesneler.
Başka bir deyişle, bu derlenmeyecektir:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
bu da olmayacak:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
bu da olmayacak:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
Sonuç
Yukarıdaki yöntemler ihtiyaçlarınızı karşılasa da, sorunuzun (doğru olarak gördüğüm) tek doğru cevabı, ekstra bir kontrole ihtiyacınız olacaktır:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
elbette bir yöntemde daha mantıklı:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}