हमें किसी ऑब्जेक्ट को लागू करने वाले ऑब्जेक्ट्स के सभी उदाहरण प्राप्त करने की आवश्यकता है - क्या हम ऐसा कर सकते हैं, और यदि ऐसा है तो कैसे?मैं किसी दिए गए इंटरफ़ेस को लागू करने वाले सभी लोड किए गए प्रकारों के सभी उदाहरण कैसे प्राप्त करूं?
मैं किसी दिए गए इंटरफ़ेस को लागू करने वाले सभी लोड किए गए प्रकारों के सभी उदाहरण कैसे प्राप्त करूं?
उत्तर
मुझे विश्वास नहीं है कि एक तरीका है ... आपको या तो हेप चलने में सक्षम होना होगा, और वहां प्रत्येक ऑब्जेक्ट की जांच करनी होगी, या एप्लिकेशन प्रोसेस स्पेस में प्रत्येक सक्रिय थ्रेड के ढेर पर चलना होगा, प्रत्येक की जांच करना प्रत्येक थ्रेड पर स्टैक संदर्भ चर ...
दूसरी तरफ, (मुझे लगता है कि आप ऐसा नहीं कर सकते हैं) सभी ऑब्जेक्ट निर्माण गतिविधियों (एक कंटेनर दृष्टिकोण का उपयोग करके) को रोकता है और आपके आवेदन में सभी ऑब्जेक्ट्स की एक सूची रखता है। ..
यदि आपको विशेष इंटरफ़ेस को लागू करने वाले सभी प्रकार के उदाहरण (नमूने) की आवश्यकता है तो आप सभी प्रकार के माध्यम से जा सकते हैं, इंटरफ़ेस की जांच कर सकते हैं और मिलान मिलने पर इंस्टेंस बना सकते हैं।
यहां कुछ छद्म कोड है जो उल्लेखनीय रूप से सी # की तरह दिखता है और जो भी आपको चाहिए उसे संकलित और वापस कर सकता है। और कुछ नहीं, यह सही दिशा में आप बात करेंगे, तो:
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 रनटाइम द्वारा संग्रहीत नहीं है (इसलिए हेप/स्टैक की जांच करके डीबगर/प्रोफाइलर्स द्वारा गणना की जा सकती है)।
इस कारण के आधार पर आपको लगता है कि आपको ऐसा करने की ज़रूरत है कि इसके बारे में जाने के शायद बेहतर तरीके हैं।
किसी ऑब्जेक्ट या सभी प्रकार के सभी उदाहरण?
ऑब्जेक्ट के सभी उदाहरण प्राप्त करना असंभव के करीब होगा, और इसमें प्रबंधन स्मृति के माध्यम से स्कैन के बारे में गैर-सार्वजनिक जानकारी शामिल होगी।
किसी दिए गए इंटरफ़ेस को लागू करने वाले सभी प्रकार प्राप्त करना --- किसी दिए गए डोमेन के भीतर कर योग्य है।
- लोड विधानसभा
- दोहराएं यह प्रकार के माध्यम से() asm.GetTypes फोन() (यानी, आप सभी प्रकार के एक विधानसभा है कि एक विशेष इंटरफ़ेस को लागू भीतर परिभाषित पा सकते हैं)
- चेक typeof (IMyInterface) .IsAssignibleFrom (testType)
किसी ऑब्जेक्ट के सभी उदाहरण। – Simon
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[] {};
}
अच्छा - लेकिन मैं उन प्रकारों के उदाहरण कैसे प्राप्त करूं? – Simon
@ सिमॉन, ऐसा करने का एकमात्र तरीका सृजन पर प्रत्येक उदाहरण के संदर्भ दर्ज करना है। आप इस तरह के एक तंत्र को पहले स्थापित किए बिना उन तक नहीं पहुंच सकते हैं। आपके उपयोग के मामले के आधार पर, आप [ObservableCollection] (http://msdn.microsoft.com/en-us/library/ms668604.aspx) में देखना चाहेंगे ... आपका उपयोग केस क्या है? – smartcaveman
यह @ विल के उत्तर में मेरी टिप्पणी के अनुसार है - हम मॉड्यूल लोड करते हैं जो एक ही इंटरफ़ेस को लागू करने वाली ऑब्जेक्ट्स का उपयोग करके अपनी सेटिंग्स संग्रहीत करते हैं, लेकिन सेटिंग इंस्टेंस को प्राप्त करने का कोई अन्य तरीका प्रतीत नहीं होता है। – Simon
कक्षाएं निर्दिष्ट इंटरफेस को लागू तुम्हारा रहे हैं तो आप इन्स्टेन्शियशन पर कमजोर संदर्भ की एक सूची लागू कर सकते हैं।
मुझे डर है कि वे हमारे सभी नहीं हैं। – Simon
- 1. इंटरफ़ेस को लागू करने वाले सभी प्रकारों को प्राप्त करना
- 2. दिए गए इंटरफ़ेस को लागू करने वाले सभी वर्गों को कैसे ढूंढें?
- 3. किसी दिए गए इंटरफ़ेस को लागू करने वाले सभी डेल्फी कक्षाओं का आकलन करें?
- 4. किसी दिए गए त्रिज्या के अंदर सभी मार्करों को ढूंढना
- 5. किसी दिए गए सरणी के सभी संभावित सबसेट कैसे ढूंढें?
- 6. किसी दिए गए सेट के सभी तत्वों को jpql
- 7. किसी दिए गए कुंजी
- 8. सभी इंस्टॉल किए गए फोंट
- 9. किसी दिए गए आईडी
- 10. किसी दिए गए देश के सभी शहर Google मानचित्र
- 11. mysql: किसी दिए गए डेटाबेस के सभी खुले कनेक्शन देखें?
- 12. किसी दिए गए शब्द
- 13. किसी दिए गए प्रक्रिया आईडी के सभी थ्रेड खोजें
- 14. फारो/स्क्वाक - मैं किसी दिए गए वर्ग में किसी दिए गए विधि के कार्यान्वयन को तुरंत कैसे ब्राउज़ करूं?
- 15. किसी एप्लिकेशन में किए गए सभी फ़ंक्शन कॉल की सूची
- 16. किसी दिए गए रेंज में सभी संख्याओं का एक्सओआर खोजें
- 17. किसी दिए गए फ़ाइल
- 18. PHPUnit में दिए गए इंटरफ़ेस को लागू करने वाले नकली ऑब्जेक्ट पर अपरिभाषित विधि?
- 19. किसी दिए गए हैशटैग
- 20. किसी दिए गए रंग
- 21. टीएफएस टीम क्वेरी: किसी दिए गए समय से सभी बदले गए कार्य आइटम प्राप्त करें
- 22. किसी दिए गए फ़ॉन्ट
- 23. किसी दिए गए प्रकार को विशेषज्ञता देने वाले सभी विधियों को ढूंढें
- 24. किसी दिए गए क्रमपरिवर्तन
- 25. किसी दिए गए डॉम तत्व के लिए सभी परिभाषित सीएसएस चयनकर्ता कैसे प्राप्त करें?
- 26. किसी दिए गए बिंदु
- 27. किसी दिए गए नंबर
- 28. पायथन के साथ किसी प्रक्रिया द्वारा लोड किए गए सभी डीएलएस को कैसे सूचीबद्ध करें?
- 29. बच्चे को दिए गए सभी पूर्वजों को दोबारा ढूंढें
- 30. किसी दिए गए समयावधि
हाँ, मैं पहले-तत्काल उदाहरण प्राप्त करना चाहता हूं। ऐसा इसलिए है क्योंकि हम मॉड्यूल लोड करते हैं जो एक ही इंटरफ़ेस को लागू करने वाली ऑब्जेक्ट्स का उपयोग करके अपनी सेटिंग्स संग्रहीत करते हैं, लेकिन सेटिंग इंस्टेंस को प्राप्त करने का कोई अन्य तरीका प्रतीत नहीं होता है। – Simon
+1 धन्यवाद। टी को कास्ट जोड़ा गया जिसने मेरे लिए कोड संकलित किया। –
@ सैमहोल्डर: अरे, आप किसी भी बग को ठीक करने के लिए संपादित कर सकते हैं ... – Will