असेंबली में सभी प्रकारों का पता कैसे लगाएं कि एक विशिष्ट प्रकार C # से Inherit


92

आपको उन सभी प्रकारों का संग्रह कैसे मिलता है जो एक विशिष्ट अन्य प्रकार से प्राप्त होते हैं?

जवाबों:


150

कुछ इस तरह:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
    return assembly.GetTypes().Where(t => baseType.IsAssignableFrom(t));
}

यदि आपको जेनेरिक को संभालने की आवश्यकता है, तो यह कुछ हद तक पेचीदा हो जाता है (जैसे खुले List<>प्रकार से गुजरना लेकिन एक प्रकार जो वापस से प्राप्त करने की अपेक्षा करता है List<int>)। अन्यथा यह आसान है :)

यदि आप स्वयं प्रकार को बाहर करना चाहते हैं, तो आप इतनी आसानी से कर सकते हैं:

public IEnumerable<Type> FindDerivedTypes(Assembly assembly, Type baseType)
{
    return assembly.GetTypes().Where(t => t != baseType && 
                                          baseType.IsAssignableFrom(t));
}

ध्यान दें कि यह आपको एक इंटरफ़ेस निर्दिष्ट करने और सभी प्रकारों को खोजने की अनुमति देगा जो इसे लागू करने के बजाय केवल कक्षाओं के साथ काम Type.IsSubclassOfकरता है।


2
धन्यवाद! मैंने इस धन्यवाद का उपयोग करना समाप्त कर दिया - मैंने इस सार्वजनिक स्थैतिक सूची <टाइप> GetAllSubclassesOf (टाइप बेस टाइप) {रिटर्न असेम्बली। गेटएसेवे (बेसटाइप) .गेटटाइप्स () का उपयोग कर समाप्त किया। जहाँ (प्रकार => type.IsSubclassOf (बेस टाइप))। सूची बनाने के लिए(); }
aceinthehole

@Downvoter यहाँ। मेरी टिप्पणी याद आ गई। जैसा कि aintinthehole ने संकेत दिया है कि उत्तर गलत है। मैंने सही जवाब जोड़ दिया है क्योंकि मैंने इक्के टिप्पणी को याद किया जब तक मुझे पता नहीं चला कि कोड काम नहीं करता। क्रिसमस की बधाई।
टिम मर्फी

@ समय: यह गलत नहीं है, यह थोड़ा अलग है। IsAssignableFromसाथ ही काम करना चाहिए। विशेष रूप से, मेरा संस्करण इंटरफेस के साथ भी कॉपी करता है। आपने मेरे कोड का परीक्षण किया? मेरा उत्तर किस मामले पर विफल है?
जॉन स्कीट

1
@Jon। काफी सही अपने तरीके इंटरफेस संभालती है। मैं एक VB प्रोग्रामर हूं, हम कक्षाएं विरासत में लेते हैं और इंटरफेस लागू करते हैं। क्या यह C # में अलग है? मैं पूछता हूं क्योंकि प्रश्न, जैसा कि मुझे आवश्यक था, प्रकार चाहते हैं कि एक प्रकार का वारिस हो जो एक प्रकार को लागू नहीं करता है।
टिम मर्फी

2
@ समय: सी # में हम दोनों के लिए ":" का उपयोग करते हैं ... लेकिन मैं आमतौर पर इंटरफेस को एक प्रकार की विरासत पदानुक्रम के हिस्से के रूप में मानता हूं।
जॉन स्कीट

27

निम्न विधि से उन प्रकारों का एक संग्रह मिलेगा जो एक प्रकार का वारिस होता है।

सी#

public IEnumerable<Type> FindSubClassesOf<TBaseType>()
{   
    var baseType = typeof(TBaseType);
    var assembly = baseType.Assembly;

    return assembly.GetTypes().Where(t => t.IsSubclassOf(baseType));
}

VB.NET

Public Function FindSubClasses(Of TBaseType)() As IEnumerable(Of Type)

    Dim baseType = GetType(TBaseType)
    Dim assembly = baseType.Assembly

    Return From t In assembly.GetTypes() 
           Where t.IsSubClassOf(baseType) 
           Select t

End Function

यदि आपको उस प्रकार को शामिल करने की आवश्यकता है जो एक इंटरफ़ेस को लागू करता है तो देखें @Jon Skeet का उत्तर।


1

आपको सभी प्रकारों की गणना करनी होगी और प्रत्येक के लिए जांच करनी होगी कि क्या वह आपके द्वारा खोजा जा रहा है।

इस प्रश्न में एक जैसा कुछ कोड आपके लिए उपयोगी हो सकता है।


1

इस पद्धति का उपयोग करने पर विचार करें (PCL के लिए लिखा गया है):

public IEnumerable<Type> FindDerivedTypes( Assembly assembly, Type baseType )
{
        TypeInfo baseTypeInfo = baseType.GetTypeInfo();
        bool isClass = baseTypeInfo.IsClass, isInterface = baseTypeInfo.IsInterface;

        return
            from type in assembly.DefinedTypes
            where isClass ? type.IsSubclassOf( baseType ) :
                  isInterface ? type.ImplementedInterfaces.Contains( baseTypeInfo.AsType() ) : false
            select type.AsType();
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.