जाहिर है, नहीं।
यहाँ विकल्प हैं:
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;
}