2009-08-17 10 views
6

मेरे पास एक असेंबली है, और मैं एक विशिष्ट वर्ग/इंटरफ़ेस से प्राप्त सभी वर्गों को सूचीबद्ध करना चाहता हूं।किसी विशिष्ट वर्ग/इंटरफ़ेस से प्राप्त सभी वर्गों की सूची

मैं यह कैसे करूँगा?

उत्तर

7

कुछ की तरह:

public static IEnumerable<Type> GetSubtypes(Assembly assembly, Type parent) 
{ 
    return assembly.GetTypes() 
        .Where(type => parent.IsAssignableFrom(type)); 
} 

कि सरल मामले के लिए ठीक है, लेकिन इसे और अधिक "रोचक" हो जाता है (पढ़ें: मुश्किल) जब आप खोजने के लिए "सभी प्रकार के किसी भी T के लिए IEnumerable<T> को लागू करने" आदि

चाहते

(जैसा कि एडम कहता है, आप आसानी से इसे एक विस्तार विधि बना सकते हैं। यह इस बात पर निर्भर करता है कि आप इसका पुन: उपयोग करेंगे या नहीं - यह एक दर्द है कि एक्सटेंशन विधियों को गैर-नेस्टेड स्थैतिक वर्ग में होना चाहिए ...)

+0

मुझे सामान्य रूप से स्कीटेड मिला। साथ ही इसे एक विस्तार विधि भी बना सकते हैं। –

+0

@ जोन, यदि आप किसी भी टी "इत्यादि" के लिए IENumerable लागू करने वाले सभी प्रकारों को "आप ढूंढना चाहते हैं" तो आप कैसे करेंगे? इसके अलावा आपने कहा "यह एक दर्द है कि एक्सटेंशन विधियों को गैर-नेस्टेड स्थैतिक वर्ग में होना चाहिए"। क्यूं कर? क्या आप अक्सर नेस्टेड कक्षाओं का उपयोग करते हैं। धन्यवाद। –

+0

@ जोआन: मुझे यह जानने की आवश्यकता होगी कि क्या यह * विशेष * 'आईनेमरेबल ' या * * * * inumerable '(यानी टी निर्दिष्ट है या नहीं?) के कार्यान्वयन के लिए है ... I कई शीर्ष स्तरीय स्थैतिक वर्गों को लिखने की प्रवृत्ति न करें। विस्तार विधियों के लिए केवल एक बनाना ओवरकिल का थोड़ा सा है। –

3
public static IEnumerable<Type> GetTypesThatInheritFrom<T>(this Assembly asm) 
{ 
    var types = from t in asm.GetTypes() 
       where typeof(T).IsAssignableFrom(t) 
       select t; 
    return types; 
} 
संबंधित मुद्दे