เห็นได้ชัดว่าไม่มี
นี่คือตัวเลือก:
Type.IsSubclassOf
ตามที่คุณค้นพบแล้วสิ่งนี้จะไม่ทำงานหากทั้งสองประเภทเหมือนกันนี่คือตัวอย่างโปรแกรมLINQPadที่สาธิต:
void Main()
{
typeof(Derived).IsSubclassOf(typeof(Base)).Dump();
typeof(Base).IsSubclassOf(typeof(Base)).Dump();
}
public class Base { }
public class Derived : Base { }
เอาท์พุท:
True
False
ซึ่งบ่งชี้ว่าDerived
เป็นคลาสย่อยของBase
แต่นั่นBase
คือ (แน่นอน) ไม่ใช่คลาสย่อยของตัวเอง
Type.IsAssignableFrom
ตอนนี้จะตอบคำถามของคุณโดยเฉพาะ แต่จะให้ผลบวกที่ผิด ตามที่ Eric Lippert ได้ชี้ให้เห็นในความคิดเห็นในขณะที่วิธีการจะตอบกลับTrue
สำหรับคำถามทั้งสองข้างต้นอย่างแน่นอนแต่ก็จะส่งคืนTrue
สิ่งเหล่านี้ซึ่งคุณอาจไม่ต้องการ:
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 { }
ที่นี่คุณจะได้รับผลลัพธ์ต่อไปนี้:
True
True
True
สุดท้ายTrue
ก็จะบ่งบอกถ้าวิธีการเพียงตอบคำถามที่ถามว่าuint[]
สืบทอดมาจากint[]
หรือว่าพวกเขากำลังชนิดเดียวกันที่ชัดเจนไม่ได้เป็นกรณี
ดังนั้นIsAssignableFrom
ไม่ถูกต้องทั้งหมดเช่นกัน
is
และ as
"ปัญหา" ที่มีis
และas
ในบริบทของคำถามของคุณคือพวกเขาจะต้องการให้คุณดำเนินการกับวัตถุและเขียนหนึ่งในประเภทโดยตรงในรหัสและไม่ทำงานกับType
วัตถุ
กล่าวอีกนัยหนึ่งสิ่งนี้จะไม่รวบรวม:
SubClass is BaseClass
^--+---^
|
+-- need object reference here
และสิ่งนี้จะไม่:
typeof(SubClass) is typeof(BaseClass)
^-------+-------^
|
+-- need type name here, not Type object
และสิ่งนี้จะไม่:
typeof(SubClass) is BaseClass
^------+-------^
|
+-- this returns a Type object, And "System.Type" does not
inherit from BaseClass
ข้อสรุป
ในขณะที่วิธีการข้างต้นอาจตรงกับความต้องการของคุณคำตอบที่ถูกต้องสำหรับคำถามของคุณ (ตามที่ฉันเห็น) คือคุณจะต้องตรวจสอบเพิ่มเติม:
typeof(Derived).IsSubclassOf(typeof(Base)) || typeof(Derived) == typeof(Base);
ซึ่งแน่นอนมากขึ้นในวิธีการ:
public bool IsSameOrSubclass(Type potentialBase, Type potentialDescendant)
{
return potentialDescendant.IsSubclassOf(potentialBase)
|| potentialDescendant == potentialBase;
}