2008-11-19 12 views
15

हमें किसी ऑब्जेक्ट को लागू करने वाले ऑब्जेक्ट्स के सभी उदाहरण प्राप्त करने की आवश्यकता है - क्या हम ऐसा कर सकते हैं, और यदि ऐसा है तो कैसे?मैं किसी दिए गए इंटरफ़ेस को लागू करने वाले सभी लोड किए गए प्रकारों के सभी उदाहरण कैसे प्राप्त करूं?

उत्तर

6

मुझे विश्वास नहीं है कि एक तरीका है ... आपको या तो हेप चलने में सक्षम होना होगा, और वहां प्रत्येक ऑब्जेक्ट की जांच करनी होगी, या एप्लिकेशन प्रोसेस स्पेस में प्रत्येक सक्रिय थ्रेड के ढेर पर चलना होगा, प्रत्येक की जांच करना प्रत्येक थ्रेड पर स्टैक संदर्भ चर ...

दूसरी तरफ, (मुझे लगता है कि आप ऐसा नहीं कर सकते हैं) सभी ऑब्जेक्ट निर्माण गतिविधियों (एक कंटेनर दृष्टिकोण का उपयोग करके) को रोकता है और आपके आवेदन में सभी ऑब्जेक्ट्स की एक सूची रखता है। ..

17

यदि आपको विशेष इंटरफ़ेस को लागू करने वाले सभी प्रकार के उदाहरण (नमूने) की आवश्यकता है तो आप सभी प्रकार के माध्यम से जा सकते हैं, इंटरफ़ेस की जांच कर सकते हैं और मिलान मिलने पर इंस्टेंस बना सकते हैं।

यहां कुछ छद्म कोड है जो उल्लेखनीय रूप से सी # की तरह दिखता है और जो भी आपको चाहिए उसे संकलित और वापस कर सकता है। और कुछ नहीं, यह सही दिशा में आप बात करेंगे, तो:

public static IEnumerable<T> GetInstancesOfImplementingTypes<T>() 
{ 
    AppDomain app = AppDomain.CurrentDomain; 
    Assembly[] ass = app.GetAssemblies(); 
    Type[] types; 
    Type targetType = typeof(T); 

    foreach (Assembly a in ass) 
    { 
     types = a.GetTypes(); 
     foreach (Type t in types) 
     { 
      if (t.IsInterface) continue; 
      if (t.IsAbstract) continue; 
      foreach (Type iface in t.GetInterfaces()) 
      { 
       if (!iface.Equals(targetType)) continue; 
       yield return (T) Activator.CreateInstance(t); 
       break; 
      } 
     } 
    } 
} 

अब, आप ढेर चलने और सभी वस्तुओं है कि एक विशेष प्रकार के रूप में उस पर, अच्छी किस्मत लागू की पहले से instantiated उदाहरणों लौटने के बारे में बात कर रहे हैं यह जानकारी .NET रनटाइम द्वारा संग्रहीत नहीं है (इसलिए हेप/स्टैक की जांच करके डीबगर/प्रोफाइलर्स द्वारा गणना की जा सकती है)।

इस कारण के आधार पर आपको लगता है कि आपको ऐसा करने की ज़रूरत है कि इसके बारे में जाने के शायद बेहतर तरीके हैं।

+1

हाँ, मैं पहले-तत्काल उदाहरण प्राप्त करना चाहता हूं। ऐसा इसलिए है क्योंकि हम मॉड्यूल लोड करते हैं जो एक ही इंटरफ़ेस को लागू करने वाली ऑब्जेक्ट्स का उपयोग करके अपनी सेटिंग्स संग्रहीत करते हैं, लेकिन सेटिंग इंस्टेंस को प्राप्त करने का कोई अन्य तरीका प्रतीत नहीं होता है। – Simon

+0

+1 धन्यवाद। टी को कास्ट जोड़ा गया जिसने मेरे लिए कोड संकलित किया। –

+0

@ सैमहोल्डर: अरे, आप किसी भी बग को ठीक करने के लिए संपादित कर सकते हैं ... – Will

4

किसी ऑब्जेक्ट या सभी प्रकार के सभी उदाहरण?

ऑब्जेक्ट के सभी उदाहरण प्राप्त करना असंभव के करीब होगा, और इसमें प्रबंधन स्मृति के माध्यम से स्कैन के बारे में गैर-सार्वजनिक जानकारी शामिल होगी।

किसी दिए गए इंटरफ़ेस को लागू करने वाले सभी प्रकार प्राप्त करना --- किसी दिए गए डोमेन के भीतर कर योग्य है।

  • लोड विधानसभा
  • दोहराएं यह प्रकार के माध्यम से() asm.GetTypes फोन() (यानी, आप सभी प्रकार के एक विधानसभा है कि एक विशेष इंटरफ़ेस को लागू भीतर परिभाषित पा सकते हैं)
  • चेक typeof (IMyInterface) .IsAssignibleFrom (testType)
+0

किसी ऑब्जेक्ट के सभी उदाहरण। – Simon

1
IEnumerable<Type> GetAllTypesThatImplementInterface<T>() 
{ 
    var @interface = typeof (T); 
    return @interface.IsInterface 
       ? AppDomain.CurrentDomain.GetAssemblies() 
        .SelectMany(assembly => assembly.GetTypes()) 
        .Where(type => !type.IsInterface 
           && !type.IsAbstract 
           && type.GetInterfaces().Contains(@interface)) 
       : new Type[] {}; 
} 
+0

अच्छा - लेकिन मैं उन प्रकारों के उदाहरण कैसे प्राप्त करूं? – Simon

+0

@ सिमॉन, ऐसा करने का एकमात्र तरीका सृजन पर प्रत्येक उदाहरण के संदर्भ दर्ज करना है। आप इस तरह के एक तंत्र को पहले स्थापित किए बिना उन तक नहीं पहुंच सकते हैं। आपके उपयोग के मामले के आधार पर, आप [ObservableCollection] (http://msdn.microsoft.com/en-us/library/ms668604.aspx) में देखना चाहेंगे ... आपका उपयोग केस क्या है? – smartcaveman

+0

यह @ विल के उत्तर में मेरी टिप्पणी के अनुसार है - हम मॉड्यूल लोड करते हैं जो एक ही इंटरफ़ेस को लागू करने वाली ऑब्जेक्ट्स का उपयोग करके अपनी सेटिंग्स संग्रहीत करते हैं, लेकिन सेटिंग इंस्टेंस को प्राप्त करने का कोई अन्य तरीका प्रतीत नहीं होता है। – Simon

2

कक्षाएं निर्दिष्ट इंटरफेस को लागू तुम्हारा रहे हैं तो आप इन्स्टेन्शियशन पर कमजोर संदर्भ की एक सूची लागू कर सकते हैं।

+0

मुझे डर है कि वे हमारे सभी नहीं हैं। – Simon

संबंधित मुद्दे