Объект типа 'customObject' не может быть преобразован для ввода 'customObject'

Я получаю следующую ошибку, когда я вызываю пользовательский объект
"Object of type 'customObject' cannot be converted to type 'customObject'."

Следующее является сценарием, когда я, получают эту ошибку:

  • Я вызываю метод в dll динамично.
  • Загрузите блок
  • CreateInstance....

При вызове MethodInfo. Вызовите () передающий интервал, строка в качестве параметра для моего метода хорошо работает =>, Никакие исключения не выдаются.

Но если я пытаюсь передать один из своих собственных объектов класса в качестве параметра, затем я добираюсь ArgumentException исключение, и это не ни один ArgumentOutOfRangeException или ArgumentNullException.

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

Я делаю это в веб-приложении.

Файл класса, содержащий метод, находится в другом проекте. Также пользовательский объект является отдельным классом в том же файле.

Нет такой вещи, названной a static assembly в моем коде. Я пытаюсь вызвать webmethod динамично. этот webmethod имеет тип customObject как входной параметр. Таким образом, когда я вызываю webmethod, я динамично создаю блок прокси и так далее. От того же блока я пытаюсь создать экземпляр объекта cusotm присвоение значений к его свойствам и затем передаче этого объекта в качестве параметра и вызову метода. все динамично, и ничто не создается статичное..:(

добавьте, что ссылка не используется. Следующее является примером кода, я пытался создать его

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 в том, что я делаю.

Любая справка значительно ценится.

С уважением, Phani Kumar PV

5
задан mjv 6 November 2012 в 20:06
поделиться

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);

Я думаю, вы увидите, что он дает те же результаты, что и вы.

2
ответ дан 14 December 2019 в 19:07
поделиться

Позвольте мне попытаться объяснить наиболее вероятную причину возникновения проблемы в моем подходе.

Когда я вызвал метод в сборке, названный "methodname" в веб-сервисе, я пытаюсь передать необходимые для этого параметры как args [] в функцию "CallWebService" This args [] при передаче будет успешно работать, когда я попытаюсь передать обычные параметры, такие как примитивные типы, включая строку.

Но именно это я сделал, когда попытался передать настраиваемый объект в качестве параметра.

Три вещи, которые здесь выполняются.

  1. создать объект этого типа вне функции CallWebService (используя отражение). когда я так поступил, происходит то, что происходит внутри экземпляра customobject с временным именем dll.
  2. после того, как я установил свойства объекта и отправил его функции CallWebService как объект в массиве args.
  3. Я устал создавать экземпляр веб-сервиса, создавая динамическую dll.

    объект wsvcClass = results.CompiledAssembly.CreateInstance (foundType.ToString ());

Когда я наконец попытался вызвать метод с экземпляром созданной динамической сборки , я попытался передать customobject, созданный на шаге 1,2, через свойство args.

во время вызова CLR пытается увидеть, принадлежат ли customobject, который передается в качестве входных данных, и метод, который вызывается, из одной и той же библиотеки DLL.

, что, очевидно, отличается от способа реализации.

Итак, следующий подход, который следует использовать для решения проблемы Мне нужно создать сборку настраиваемого объекта с той же сборкой, которую я использовал для создания экземпляра веб-службы.

Я реализовал это подход полностью и все получилось отлично

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;
}
2
ответ дан 14 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: