2009-05-28 9 views
7

द्वारा विधि को आमंत्रित करें मैं एक निश्चित विशेषता के साथ विधियों को आमंत्रित करना चाहता हूं। तो मैं अपनी असेंबली के साथ विधियों को खोजने के लिए सभी असेंबली और सभी विधियों के माध्यम से साइकिल चला रहा हूं। ठीक काम करता है, लेकिन जब मैं इसे केवल MethodInfo मिला तो मैं एक निश्चित विधि कैसे शुरू करूं?MethodInfo

AppDomain app = AppDomain.CurrentDomain; 
Assembly[] ass = app.GetAssemblies(); 
Type[] types; 
foreach (Assembly a in ass) 
{ 
    types = a.GetTypes(); 
    foreach (Type t in types) 
    { 
     MethodInfo[] methods = t.GetMethods(); 
     foreach (MethodInfo method in methods) 
     { 
      // Invoke a certain method 
     } 
    } 
} 

समस्या यह है कि मुझे उस वर्ग के उदाहरण को नहीं पता है जिसमें उस निश्चित विधि शामिल हैं। तो मैं इसे ठीक से नहीं बुला सकता क्योंकि विधियां स्थैतिक नहीं हैं। यदि भी संभव हो तो मैं इस कक्षा का एक नया उदाहरण बनाने से बचना चाहता हूं।

उत्तर

5

यह समस्या परिभाषा के बजाय कोडिंग के मामले में एक मुद्दे के रूप में मुझे हमलों:

मान लिया जाये कि आप इसे स्थिर नहीं कर सकते हैं तो कोड की जरूरत है इस प्रकार है।

इंस्टेंस विधियां इस बात पर निर्भर करती हैं कि उन्हें किस उदाहरण पर बुलाया जाता है - इसके बारे में ध्यान दिए बिना किसी उदाहरण विधि को कॉल करने का कोई मतलब नहीं है। (जैसा कि मार्टिन कहते हैं, एक उदाहरण विधि जो परवाह नहीं करती है, जिस पर इसे बुलाया जा रहा है, लगभग हमेशा स्थिर होना चाहिए। इसके लिए केवल एकमात्र तत्काल अपवाद है जिसके बारे में मैं सोच सकता हूं वह वर्चुअल विधियां है, जहां उदाहरण स्पष्ट रूप से उपयोग करने के लिए कौन सा कार्यान्वयन निर्दिष्ट करता है।)

यह बताएं कि वास्तव में का अर्थ है आपके संदर्भ में एनोटेटेड इंस्टेंस विधि होने के लिए। आप वैसे भी तरीकों का आह्वान करने की कोशिश क्यों कर रहे हैं? बड़ी तस्वीर क्या है? आपके पास क्या संदर्भ है? मुझे दृढ़ता से संदेह है कि आप एक संदर्भ की कुछ धारणा चाहते हैं - वस्तुओं का संग्रह जो आप पर उदाहरण विधियों को कॉल कर सकते हैं।

+0

मैं क्या करना चाहता हूं एक कस्टम विशेषता के साथ विधियों को चिह्नित करना ताकि उन्हें कमांडलाइन द्वारा आमंत्रित किया जा सके। कोई फर्क नहीं पड़ता कि वे कहाँ हैं। लेकिन मैं आपसे सहमत हूं कि सीरेलल उदाहरणों पर समान तरीकों का आह्वान करने का कोई मतलब नहीं है, जहां विधि स्थैतिक नहीं है। तो मैं इसे एक प्रकार के मैनेजर क्लास में उपयोग करूंगा जिसमें इन ऑब्जेक्ट्स का संग्रह प्रति पैरामीटर के विशिष्ट उदाहरण पर एक आवेषण कॉल करने के लिए होता है। मुझे लगता है कि यह वही करेगा जो मैं चाहता हूं। धन्यवाद – apparat

11

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

foreach (Type t in types) 
    { 
      object instance = Activator.CreateInstance(t); 

      MethodInfo[] methods = t.GetMethods(); 
      foreach (MethodInfo method in methods) 
      {      
       method.Invoke(instance, params...);  
      } 
    } 
+0

वास्तव में; गैर स्थैतिक विधियां ** उदाहरण ** विशिष्ट हैं। स्थैतिक विधियां कक्षा विशिष्ट हैं। – Kris

+0

हूप्स। संपादित - धन्यवाद। –

0

असल में, मुझे लगता है कि आपको मौजूदा वस्तुओं की सूची बनाने और सूची को खोजने के लिए क्या करना है। इसलिए जब आप इन अनावश्यक वस्तुओं को बनाते हैं, तो आप उन्हें सूची में संग्रहित करेंगे (या शायद सूची किसी अन्य प्रकार की वस्तुओं की एक सूची होनी चाहिए जिसमें अनावश्यक वस्तु का वर्णन भी हो)। फिर आप रनटाइम पर सूची स्कैन कर सकते हैं, उस ईवेंट को ढूंढें जो आपके द्वारा प्रबंधित किए जाने वाले ईवेंट के प्रकार से मेल खाता है, और उसके बाद अपनी विधि को देखें और कॉल करें। विधि जानकारी पर इवोकोक, यह मानते हुए कि आप क्या करना चाहते हैं। आपको उचित तर्कों में भी पारित करने की आवश्यकता होगी, लेकिन आप सही प्रकार की वस्तुओं का वेक्टर बनाकर ऐसा कर सकते हैं।

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