2010-11-02 21 views
38

के साथ एक आंतरिक कक्षा में मानकों के साथ एक निर्माता instantiating मैं इस की तर्ज पर कुछ है:प्रतिबिंब

object[] parameter = new object[1]; 
parameter[0] = x; 
object instantiatedType = 
Activator.CreateInstance(typeToInstantiate, parameter); 

और

internal class xxx : ICompare<Type> 
{ 
    private object[] x; 

    # region Constructors 

    internal xxx(object[] x) 
    { 
     this.x = x; 
    } 

    internal xxx() 
    { 
    } 

    ... 
} 

और मैं मिलता है:

अपवाद दिए: प्रणाली .MissingMethodException: प्रकार 'xxxx.xxx' पर कंस्ट्रक्टर नहीं मिला ..

कोई विचार?

Activator.CreateInstance(typeToInstantiate,new object[] { parameter }); 

को

+0

मूल रूप से हालांकि आप 'पैरामीटर' को 'x'' के रूप में पारित करने के लिए लक्षित करते हैं। हालांकि, मुझे अभी एहसास हुआ कि शायद आपके पास क्या मतलब नहीं है और दूसरे उत्तरों को देखते हुए, ऐसा लगता है कि मैं अकेला नहीं हूं। यदि यह सही है, तो मैं 'पैरामीटर' को 'पैरामीटर' में नाम बदलने का सुझाव देता हूं। या बेहतर अभी भी, 'पैरामीटर' के साथ पूरी तरह से वितरण करें: 'Activator.CreateInstance (typeToInstantiate, new object [] {x}) '। –

उत्तर

75

में मुद्दा यह है कि Activator.CreateInstance(Type, object[]) गैर सरकारी कंस्ट्रक्टर्स पर विचार नहीं करता है।

अपवाद

MissingMethodException: नहीं मिलान सार्वजनिक निर्माता मिला था।

यह आसानी से public दृश्यता में कन्स्ट्रक्टर को बदलकर दिखाया गया है; कोड सही ढंग से काम करता है।

BindingFlags flags = BindingFlags.NonPublic | BindingFlags.Instance; 
CultureInfo culture = null; // use InvariantCulture or other if you prefer 
object instantiatedType = 
    Activator.CreateInstance(typeToInstantiate, flags, null, parameter, culture); 

आप केवल parameterless निर्माता की आवश्यकता होती है इस रूप में अच्छी तरह से काम करेगा::

यहाँ एक वैकल्पिक हल (परीक्षण किया) है

//using the overload: public static object CreateInstance(Type type, bool nonPublic) 
object instantiatedType = Activator.CreateInstance(typeToInstantiate, true) 
+0

आपके सभी उत्तर वैध थे, धन्यवाद। – KP65

+0

मुझे इसे बुकमार्क करना चाहिए। –

+10

मैंने इसका परीक्षण किया और लगता है कि यह उल्लेखनीय है कि यह विधि केवल गैर-सार्वजनिक रचनाकारों के साथ काम करती है। इसे सार्वजनिक और गैर-सार्वजनिक रचनाकारों के साथ काम करने के लिए, 'बाइंडिंगफ्लैग्स' को 'बाइंडिंगफ्लैग्स' में बदलें। बाइंडिंगफ्लैग नॉनपब्लिक | BindingFlags.Instance' – ken

1

परिवर्तन यह इसका कारण यह है अपने निर्माता भी एक वस्तु सरणी उम्मीद और उत्प्रेरक पहले से ही यह विभाजन अलग वस्तुओं

3

आप देता है कि a different overload of Activator.CreateInstance कॉल करने की आवश्यकता आप पारित एक nonPublic या BindingFlags पैरामीटर।

मुझे ये सभी CreateInstance ओवरलोड्स बेकार लगता है; मुझे क्या करना पसंद करते हैं यह है:

  1. कॉल typeToInstantiate.GetConstructor(), गुजर BindingFlags.NonPublic
  2. कॉल ConstructorInfo.Invoke, यह निर्माता पैरामीटर
18

(सफलतापूर्वक परीक्षण)

object instantiatedType = 
    Activator.CreateInstance(typeToInstantiate, 
    System.Reflection.BindingFlags.NonPublic | 
    System.Reflection.BindingFlags.Instance, 
    null, new object[] {parameter}, null); 

दो मुद्दों कर रहे हैं गुजर यह पता:

  • new object[] {parameter} में मदद करता है यह एक object[] एक एकल विधि के पैरामीटर है कि एक params object[] तर्क
  • BindingFlags में मदद करता है गैर सरकारी निर्माता को हल

(दो null रों लेता है के रूप में पारित करने के मुद्दे को सुलझाने बाइंडर से संबंधित है; डिफ़ॉल्ट बाइंडर व्यवहार जो हम चाहते हैं उसके लिए ठीक है)