जाहिर है, नहीं।
यहाँ विकल्प हैं:
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
अब, यह आपके विशेष प्रश्न का उत्तर देगा, लेकिन यह आपको झूठी सकारात्मकता भी देगा। जैसा कि एरिक लिपर्ट ने टिप्पणियों में बताया है, जबकि विधि वास्तव 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;
}