2010-04-12 22 views
5

मैं निम्न त्रुटि प्राप्त जब मैं एक कस्टम वस्तु
"Object of type 'customObject' cannot be converted to type 'customObject'."वस्तु टाइप करने के लिए नहीं बदला जा सकता 'customObject'

बाद आह्वान परिदृश्य जब मैं इस त्रुटि मिलती हूँ:

  • मैं गतिशील रूप से एक डीएल में एक विधि का आह्वान करता हूं।
  • लोड एक विधानसभा
  • CreateInstance ....

जब मेरे विधि के लिए एक पैरामीटर के रूप MethodInfo.Invoke() गुजर पूर्णांक, स्ट्रिंग बुला ठीक => कोई अपवाद फेंक दिया जाता है काम करता है।

लेकिन यदि मैं पैरामीटर के रूप में अपनी खुद की कस्टम क्लास ऑब्जेक्ट्स में से किसी एक को कोशिश करता हूं और पास करता हूं, तो मुझे ArgumentException अपवाद मिलता है, और यह या तो ArgumentOutOfRangeException या ArgumentNullException नहीं है।

"Object of type 'customObject' cannot be converted to type 'customObject'."

मैं एक वेब अनुप्रयोग में यह कर रहा हूं।

विधि वाली कक्षा फ़ाइल एक अलग परियोजना में है। साथ ही कस्टम ऑब्जेक्ट एक ही फ़ाइल में एक अलग वर्ग है।

मेरे कोड में static assembly नामक ऐसी कोई चीज़ नहीं है। मैं गतिशील रूप से एक वेबमाइट का आह्वान करने की कोशिश कर रहा हूं। इस वेबमाइड में कस्टम ऑब्जेक्ट प्रकार इनपुट पैरामीटर के रूप में है। तो जब मैं वेबमाउथ का आह्वान करता हूं तो मैं गतिशील रूप से प्रॉक्सी असेंबली और सभी बना रहा हूं। उसी असेंबली से मैं अपने गुणों के मूल्यों को मानने वाले कुसुम ऑब्जेक्ट का एक उदाहरण बनाने की कोशिश कर रहा हूं और फिर इस ऑब्जेक्ट को पैरामीटर के रूप में पास कर रहा हूं और विधि का आह्वान कर रहा हूं। सब कुछ के बाद किया जाता है एक नमूना कोड मैं इसे

public static object CallWebService(string webServiceAsmxUrl, string serviceName, string methodName, object[] args) 
    { 
     System.Net.WebClient client = new System.Net.WebClient(); 
     //-Connect To the web service 
     using (System.IO.Stream stream = client.OpenRead(webServiceAsmxUrl + "?wsdl")) 
     { 
      //--Now read the WSDL file describing a service. 
      ServiceDescription description = ServiceDescription.Read(stream); 
      ///// LOAD THE DOM ///////// 
      //--Initialize a service description importer. 
      ServiceDescriptionImporter importer = new ServiceDescriptionImporter(); 
      importer.ProtocolName = "Soap12"; // Use SOAP 1.2. 
      importer.AddServiceDescription(description, null, null); 
      //--Generate a proxy client. importer.Style = ServiceDescriptionImportStyle.Client; 
      //--Generate properties to represent primitive values. 
      importer.CodeGenerationOptions = System.Xml.Serialization.CodeGenerationOptions.GenerateProperties; 
      //--Initialize a Code-DOM tree into which we will import the service. 
      CodeNamespace nmspace = new CodeNamespace(); 
      CodeCompileUnit unit1 = new CodeCompileUnit(); 
      unit1.Namespaces.Add(nmspace); 
      //--Import the service into the Code-DOM tree. This creates proxy code 
      //--that uses the service. 
      ServiceDescriptionImportWarnings warning = importer.Import(nmspace, unit1); 
      if (warning == 0) //--If zero then we are good to go 
      { 
       //--Generate the proxy code 
       CodeDomProvider provider1 = CodeDomProvider.CreateProvider("CSharp"); 
       //--Compile the assembly proxy with the appropriate references 
       string[] assemblyReferences = new string[5] { "System.dll", "System.Web.Services.dll", "System.Web.dll", "System.Xml.dll", "System.Data.dll" }; 
       CompilerParameters parms = new CompilerParameters(assemblyReferences); 
       CompilerResults results = provider1.CompileAssemblyFromDom(parms, unit1); 
       //-Check For Errors 
       if (results.Errors.Count > 0) 
       { 
        StringBuilder sb = new StringBuilder(); 
        foreach (CompilerError oops in results.Errors) 
        { 
         sb.AppendLine("========Compiler error============"); 
         sb.AppendLine(oops.ErrorText); 
        } 
        throw new System.ApplicationException("Compile Error Occured calling webservice. " + sb.ToString()); 
       } 
       //--Finally, Invoke the web service method 
       Type foundType = null; 
       Type[] types = results.CompiledAssembly.GetTypes(); 
       foreach (Type type in types) 
       { 
        if (type.BaseType == typeof(System.Web.Services.Protocols.SoapHttpClientProtocol)) 
        { 
         Console.WriteLine(type.ToString()); 
         foundType = type; 
        } 
       } 

       object wsvcClass = results.CompiledAssembly.CreateInstance(foundType.ToString()); 
       MethodInfo mi = wsvcClass.GetType().GetMethod(methodName); 
       return mi.Invoke(wsvcClass, args); 
      } 
      else 
      { 
       return null; 
      } 
     } 
    } 

बनाने की कोशिश की है कि मैं क्या में कुछ भी static नहीं मिल सकता है गतिशील है और कुछ भी नहीं स्थिर बनाई गई है .. :(

ऐड संदर्भ नहीं किया जाता है। मैं है।

किसी भी मदद की बहुत सराहना कर रहा है।

सादर, फणी कुमार पीवी

+0

* आप यह क्यों करेंगे? क्यों न सिर्फ परियोजना में "वेब संदर्भ जोड़ें"? – Aaronaught

+0

मैं एक ऐप विकसित कर रहा हूं जिसमें डब्ल्यूएसडीएल यूआरएल दिया गया है, मुझे इसमें एक वेबमाउथ लगाने की आवश्यकता है। क्योंकि मुझे विभिन्न वेबमाइड्स का उपयोग करना है, मैं एक वेब संदर्भ नहीं कर सकता। –

उत्तर

2

क्या आपने देखा है कि प्रॉक्सी क्लास कैसा दिखता है जो उत्पन्न होता है? आप को वेब सेवा कॉल करने के लिए प्रॉक्सी की आवश्यकता नहीं है। बस एक कक्षा बनाएं जो SoapHttpClientProtocol से प्राप्त होती है और Invoke (methodName, params) पर कॉल करें।

आप इसे जितना अधिक जटिल बना रहे हैं उससे ज्यादा जटिल बना रहे हैं। ईमानदारी से।

संपादित आप इस तरह एक वर्ग बनाते हैं:

public class SoapClient : SoapHttpClientProtocol 
{ 

    public SoapClient() 
    { 

    } 

    public object[] Invoke(string method, object[] args) 
    { 
     return base.Invoke(method, args); 
    } 

} 

और इसे इस तरह कहते हैं:

SoapClient soapClient = new SoapClient(); 
soapClient.Url = webServiceAsmxUrl; 
soapClient.Invoke(methodName, args); 

मुझे लगता है कि आप यह क्या जैसे ही परिणाम है कि देखेंगे तुम कर रहे हो।

+0

मैं लिंक में साझा किए गए कोड से गुजरता हूं। ऐसा लगता है कि इसका उपयोग तब किया जा सकता है जब webservice और वेब विधियों के नामस्थानों की जानकारी उपलब्ध हो। लेकिन जिस एप्लिकेशन में मैं वर्तमान में विकास कर रहा हूं, मुझे गतिशील रूप से wdsl url मिल जाएगा और यह अक्सर बदल जाता है। उस परिदृश्य में दिए गए यूआरएल में निर्दिष्ट दृष्टिकोण मेरी समस्या का समाधान नहीं करेगा। अगर मुझे गलत दिशा में मिला तो कृपया मुझे बताएं। –

+0

मेरे उत्तर को कोड उदाहरण के साथ अपडेट किया गया है ताकि यह समझाया जा सके कि मैं किस बारे में बात कर रहा हूं। –

+0

हां, यह उत्तर सही है। वेब सेवा कोड को संकलित करने का एकमात्र कारण यह है कि यदि आपको ज्ञात वेब सेवा URL के विरुद्ध समय-समय पर जांच की आवश्यकता है। जब आप इसे आमंत्रित करते हैं तो आप पहले से ही रन टाइम पर हैं, इसलिए यह वास्तव में आपको अच्छा नहीं लगता है। – ZeroBugBounce

2

मुझे अपने दृष्टिकोण में आने वाली समस्या के सबसे संभावित कारणों को समझाने की कोशिश करें।

मैं विधानसभा "methodName" वेब सेवा मैं args [] समारोह "CallWebService" के रूप में उस के लिए आवश्यक पैरामीटर पारित करने के लिए कोशिश कर रहा हूँ के रूप में कहा जाता है में एक विधि लागू जब यह आर्ग [] जब से पारित कर दिया सफलतापूर्वक हो जाएगा काम करते समय मैं सामान्य पैरामीटर जैसे स्ट्रिंग सहित आदिम प्रकारों को पारित करने का प्रयास करता हूं।

लेकिन जब मैंने कस्टम ऑब्जेक्ट को पैरामीटर के रूप में पारित करने का प्रयास किया तो मैंने ऐसा किया।

इसमें तीन चीजें हैं जो किया जाता है।

  1. कॉलवेब सेवा फ़ंक्शन (प्रतिबिंब का उपयोग करके) के उस प्रकार का ऑब्जेक्ट बनाएं। जब मैंने ऐसा किया तो क्या होता है एक आंतरिक अस्थायी डीएल नाम के साथ बनाया गया customobject का एक उदाहरण है।
  2. एक बार जब मैं ऑब्जेक्ट के गुण सेट करता हूं और इसे ArgWebService फ़ंक्शन में Args सरणी में ऑब्जेक्ट के रूप में भेजता हूं।
  3. मैं गतिशील डीएलएल बनाकर webservice का एक उदाहरण बनाने के लिए थक गया।

    ऑब्जेक्ट wsvcClass = results.CompiledAssembly.CreateInstance (foundType.ToString());

जब मैं अंत में गतिशील विधानसभा के उदाहरण के साथ विधि को लागू करने की कोशिश की बनाया मैं customobject कि आर्ग संपत्ति के माध्यम से कदम 1,2 पर बनाई गई है पारित करने के लिए कोशिश की।

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

जो स्पष्ट रूप से कार्यान्वयन के तरीके से नहीं है।

तो निम्नलिखित दृष्टिकोण है कि समस्या मैं एक ही विधानसभा कि मैं वेब सेवा बनाने के उदाहरण के लिए इस्तेमाल किया के साथ कस्टम वस्तु विधानसभा बनाने की जरूरत पर काबू पाने के लिए इस्तेमाल किया जाना चाहिए है ..

मैं इस दृष्टिकोण पूरी तरह से लागू किया और यह ठीक काम करता है

MethodInfo m = type.GetMethod(methodName); 
ParameterInfo[] pm = m.GetParameters(); 
object ob; 
object[] y = new object[1]; 
foreach (ParameterInfo paraminfo in pm) 
{ 
    ob = this.webServiceAssembly.CreateInstance(paraminfo.ParameterType.Name); 

    //Some Junk Logic to get the set the values to the properties of the custom Object 
    foreach (PropertyInfo propera in ob.GetType().GetProperties()) 
    { 
     if (propera.Name == "AppGroupid") 
     { 
      propera.SetValue(ob, "SQL2005Tools", null); 
     } 
     if (propera.Name == "Appid") 
     { 
      propera.SetValue(ob, "%", null); 
     } 
    } 
    y[0] = ob; 
} 
0

यह एक पुराना धागा है, लेकिन मुझे अभी भी एक ही समस्या थी। मैंने यहां देखा, यह एक पॉप अप हुआ, लेकिन मैंने कोई उपयोगी समाधान नहीं देखा।

ओपी की त्रुटि यह थी: 'customObject' प्रकार का ऑब्जेक्ट 'customObject' प्रकार में परिवर्तित नहीं किया जा सकता है।

मेरी बहुत ही समान त्रुटि यह थी: 'System.String' प्रकार का ऑब्जेक्ट 'System.Windows.Forms.AccessibleRole' प्रकार में परिवर्तित नहीं किया जा सकता है।

मैं प्रदर्शन एक वर्तमान में खोज खोजें और प्रतिस्थापित (का उपयोग CRTL + शिफ्ट + एफ संवाद बॉक्स को लाने के लिए):

यहाँ कैसे मैं मेरी समस्या हल है AccessibleRole शब्द के लिए परियोजना

Find and Replace dialog

फार्म के डिजाइनर में से एक के भीतर एक जगह है जहाँ मैं एक String चर के लिए एक AccessibleRole मान निर्दिष्ट किया गया था ToString() का उपयोग कर रहा था।

मैंने इसे ठीक किया, और मेरी समस्या दूर हो गई।

मुझे आशा है कि यह दूसरों को सहायता प्रदान करेगी।

1

यह तब हो सकता है जब आपके द्वारा प्रतिबिंबित कोड में संदर्भित एक डीएलएल का संस्करण आपके संकलित कोड में उस डीएलएल के संस्करण से अलग होता है।

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

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