2009-03-05 14 views
10

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

जो भाग मुझे ट्रिप कर रहा है वह यह है कि एक्टिवेटर आपको ऑब्जेक्ट के इंस्टेंस पर लौटाता है, जबकि एक स्थिर वर्ग में कोई उदाहरण नहीं है। क्या यह संभव है?

उत्तर

18

आपको विधि को कॉल करने के लिए एक्टिवेटर की आवश्यकता नहीं है। आप सीधे MethodInfo.Invoke का उपयोग करते हैं। पहला पैरामीटर शून्य छोड़ दिया जा सकता है।

0

यह नहीं है कि स्थैतिक वर्ग का कोई उदाहरण नहीं है, यह सिर्फ सार्वजनिक निर्माता नहीं है। एक्टिवेटर उदाहरण बनाने के लिए प्रतिबिंब का उपयोग करता है, और जब आप प्रतिबिंब का उपयोग करते हैं तो आप जो कुछ भी चाहते हैं उसे कॉल कर सकते हैं, यहां तक ​​कि निजी कन्स्ट्रक्टर

0

यदि "संसाधन" कहकर आपका मतलब है वास्तव में असेंबली में एम्बेडेड संसाधन हैं, तो आप हमेशा उन्हें मैन्युअल रूप से निकाल सकते हैं (Assembly.GetManifestResourceStream() देखें), स्थिर वर्गों का उपयोग किए बिना (उन लोगों के साथ और अधिक समस्याएं हो सकती हैं क्योंकि आप उनका उपयोग कर सकते हैं एकमात्र तरीका पूरी तरह प्रतिबिंब के साथ है)।

Spring.NET का अच्छा IResource अमूर्तता है।

और नहीं, Activator का उपयोग स्थिर वर्गों को "बनाने" के लिए नहीं किया जा सकता है।

14

GvS सही है - यहाँ उपयोग के एक उदाहरण है:

using System; 
using System.Reflection; 

class Program 
{ 
    static void Main() 
    { 
     Type type = Type.GetType("Foo"); 
     MethodInfo info = type.GetMethod("Bar"); 

     Console.WriteLine(info.Invoke(null, null)); 
    } 
} 

static class Foo 
{ 
    public static String Bar() { return "Bar"; } 
} 
+1

+1 का उपयोग कर कोड उदाहरण के लिए, कि मैं कुंजी को बहुत आलसी हूँ में – GvS

4

एक और उदाहरण MethodInfo.Invoke

Type myStaticClassType = Type.GetType("MyStaticClassNameSpace",true); 
object[] myStaticMethodArguments = {object1,object2...}; 
MethodInfo myStaticMethodInfo = myStaticClassType.GetMethod("YourMethod"); 
var myStaticMethodResult = myStaticMethodInfo.Invoke(null,myStaticMethodArguments);