Pergunta

Em um contexto de serviço da Web, eu tenho a seguinte classe que herda da classe Mamífero. A classe Mamífero é definido em um proxy. Eu não posso mudar a definição dessa classe. Porque eu preciso adicionar alguns métodos para a classe Mamífero no lado do cliente, eu herdei Mamífero e criou Giraffe.

namespace TestApplication
{  
    public class Giraffe : Mammal
    {
        public Giraffe()
        {
        }
    }
}

Quando eu chamar um WebMethod que esperar um objeto do tipo Mamífero, eu recebo a seguinte exceção dizendo que girafa não é esperado.

  Error: System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: The type Giraffe was not expected. Use the XmlInclude or SoapInclude attribute to specify types that are not known statically.
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write6_Tender(String n, String ns, Tender o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write12_PaymentRequestAuthorization(String n, String ns, PaymentRequestAuthorization o, Boolean isNullable, Boolean needType)
   at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriterPaymentRequestAuthorization.Write13_PaymentRequestAuthorization(Object o)
   --- End of inner exception stack trace ---

Existe uma solução que? Eu realmente não posso acrescentar a XmlInclude ...

Foi útil?

Solução

Para os métodos add, você deve estar usando classes parciais. Tente adicionar um segundo arquivo de classe com (na direita namespace etc):

partial class Mammal {
    public void ExtraMethod() {...}
}

A palavra-chave partial diz ao compilador para permitir que a classe a ser dividido ao longo de vários arquivos - ideal para cenários de geração de código. É, no entanto, exigir a partial palavra-chave em cada arquivo; os membros são simplesmente combinados (excepto para métodos parciais em C # 3.0, que têm o seu próprio comportamento subtil). I esperança que wsdl.exe (ou qualquer outro) inclui este!

Outras dicas

Se você quiser apenas adicionar métodos a uma classe que você não pode mudar, basta criar métodos de extensão.

public static class MammalExt {
public static void ExtraMethod(this Mammal mammal) {...}}

Embora se mamífero é uma classe de proxy gerado deve ser uma classe parcial.

Você tem que usar XmlInclude. É sua única opção. Você tem que dizer o serializador que classe você vai ser a serialização, uma vez que tem de gerar o código para fazer a serialização.

Ele só me surpreendeu ao escrever isso, que você pode começar afastado com ter Giraffe implementar IXmlSerializable, mas isso é ainda mais trabalho.

A resposta certa é realmente usar uma classe parcial. Quando você abre o projeto do cliente e gerar uma referência Web, Visual Studio analisa o WSDL e gera uma classe chamada Mammal para você. Esta classe só é visível para o projeto do cliente, assim você não precisa se preocupar com o lado do servidor de coisas.

Digamos que você tenha uma referência da Web chamado MyWebService. Em seguida, haverá uma classe chamada MyWebService.Mammal. Para adicionar membros a essa classe, tudo que você precisa fazer é criar um novo arquivo de origem que contém o seguinte:

namespace MyWebService {
    public partial class Mammal {
        public void ExtraMethod() { ... }
    }
}

Quando você chamar um método em seu serviço web que retorna um Mammal, o código de referência da Web irá criar uma nova instância do seu "melhorado" classe Mamífero, e copiar os valores do xml no fio à instância.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top