2009-01-13 14 views
11

के साथ क्रिएटइंस्टेंस मैं एक स्थानीय कॉमांड इंस्टेंस को नया करने की कोशिश कर रहा हूं जो System.Data.SqlClient.SqlCommandSet का एक निजी वर्ग है। मैं तो बस ठीक प्रकार की जानकारी हड़पने के लिए सक्षम होने के लिए लग रहे हैं:एक्टिवेटर। निजी सीलबंद वर्ग

Assembly sysData = Assembly.Load("System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"); 
localCmdType = sysData.GetType("System.Data.SqlClient.SqlCommandSet+LocalCommand"); 

लेकिन Activator.CreateInstance एक अपवाद फेंकता है जब मैं यह दृष्टांत का प्रयास करें:

object item = Activator.CreateInstance(localCmdType, 
    new object[] { commandText, parameters, num7, commandType }); 

System.MissingMethodException: निर्माता प्रकार पर 'सिस्टम .Data.SqlClient.SqlCommandSet + LocalCommand 'नहीं मिला।

कन्स्ट्रक्टर तर्क मैं प्रतिबिंब में देखे गए हस्ताक्षर से मेल खाता हूं। क्या एक अलग क्लास के साथ एक निजी वर्ग स्थापित कर रहा है जो एक अलग CreateInstance अधिभार के साथ समर्थित है या क्या?

उत्तर

18

मेरा पहला विचार ConstructorInfoConstructorInfo constructorInfo = Type.GetConstructor() का उपयोग करके और फिर constructorInfo.Invoke() का उपयोग करना होगा। मुझे संदेह है कि Activator.CreateInstance उन रचनाकारों को कॉल करना मुश्किल बनाता है जिन्हें आप आमतौर पर एक्सेस नहीं करेंगे, हालांकि मुझे इसे स्वयं याद रखने की याद नहीं है।

using System; 
using System.Reflection; 

class Test 
{ 
    public String X { get; set; } 

    Test(String x) 
    { 
     this.X = x; 
    } 
} 

class Program 
{ 
    static void Main() 
    { 
     Type type = typeof(Test); 

     ConstructorInfo c = type.GetConstructor(BindingFlags.NonPublic | BindingFlags.Instance, 
      null, new Type[] { typeof(String) }, null); 

     Object o = c.Invoke(new Object[] { "foo" }); 
    } 
} 

चाल के साथ GetConstructor बल्कि तो GetConstructors के परिणामों में यह खोजने की कोशिश कर विशेष रूप से निर्माता के बाद जाने के लिए किया गया था:

+2

डॉक्स कहना CreateInstance केवल 2.0sp1 से पहले सार्वजनिक कंस्ट्रक्टर्स कहता है। उसके बाद, आवश्यक अनुमतियों का एक गुच्छा है। –

+1

GetConstructor() पर अच्छी कॉल, जो काम करता है। मुझे यह अजीब लगता है कि GetConstructor कॉल एक्टिवेटर में से एक जैसा दिखता है। क्रिएट इंस्टेंस() अधिभार। उदाहरण के लिए –

18

मैं इसे इस तरह से काम करने के लिए मिला है। जाओ पता लगाओ।

+0

धन्यवाद! –

+0

क्या यह पीसीएल में उपलब्ध नहीं हो सकता है? –

10

मुझे जवाब देने में थोड़ा देर हो सकती है, लेकिन मैं इस विषय में फिट बैठता एक समान समस्या में भाग गया। मैं एक्टिवेटर का उपयोग कर एक गैर-सार्वजनिक कन्स्ट्रक्टर को चालू करना चाहता था। क्रिएट इंस्टेंस और इसे तर्क पास कर रहा हूं।

public class Node 
    { 
     string name; 
     Node parent; 
     protected Node(string name,Node parent) 
     { 
      this.name = name; 
      this.parent = parent; 
     } 
     public static Node Create(string name,Node parent) 
     { 
      Node result = Activator.CreateInstance(typeof(Node),BindingFlags.Instance | BindingFlags.NonPublic,null, new object[] { name, parent }, null) as Node; 
      return result; 
     } 

मुश्किल हिस्सा बाध्यकारी झंडे था। मेरा पहला वृत्ति बाध्यकारीफ्लैग्स का उपयोग करना था। क्रेते इंस्टेंस | बाध्यकारीफ्लैग। गैर-सार्वजनिक, हालांकि, जो अपवाद को फेंकने का कारण बनता है: प्रकार 'नोड' पर MissingMethodException कन्स्ट्रक्टर नहीं मिला।

// WRONG 
... Activator.CreateInstance(
     type, 
     BindingFlags.Instance 
     | BindingFlags.NonPublic 
    ); 

यह params अधिभार, जो Instance | Public | CreateInstance लागू हो जाएगी कहता है, और अपने बंधन झंडे निर्माता के लिए तर्क के रूप में पारित किया जाएगा, दे रही है: आनंद लें

+0

यह आपके द्वारा वर्णित त्रुटि के साथ विफल रहता है लेकिन विचित्र रूप से, एंड्रयू हारे का जवाब काम करता है, भले ही दोनों उत्तर एक ही बाध्यकारी झंडे साझा करते हैं। – Jerther

+0

बस काम नहीं करता है। जेरिकर की तरह, एंड्रयू हारे का जवाब करता है। –

+0

मेरे लिए एक आकर्षण की तरह काम किया! मैंने भी '' 'बाइंडिंगफ्लैग का उपयोग करने का प्रयास किया। क्रिएट इंस्टेंस | BindingFlags.NonPublic''' और एक ही त्रुटि संदेश मिला।इसे ''' बाइंडिंगफ्लैग्स में बदलना। इंस्टेंस | बाइंडिंगफ्लैग। नॉनपब्लिक''' ने इसे काम किया !! – Kaboo

0

चाल सही CreateInstance अधिभार उपयोग करने के लिए यह सुनिश्चित करना है अस्पष्ट MissingMethodException

इसके अलावा, Instance | Public | NonPublic उपयोग करें यदि आप निर्माता की दृश्यता के बारे में सुनिश्चित नहीं हैं:

// right 
... Activator.CreateInstance(
     type, 
     BindingFlags.Instance 
     | BindingFlags.Public 
     | BindingFlags.NonPublic, 
     null, 
     new object[] { }, // or your actual constructor arguments 
     null 
    ); 
संबंधित मुद्दे