Pergunta

Eu tenho um serviço Web baseado em WSE 3.0 e um aplicativo cliente WinForms que utiliza os tipos definidos nas referências.cs desse serviço, mas as subclasse para fornecer algumas funcionalidades adicionais exigidas pelo cliente.

No entanto, quando passo uma instância da subclasse de volta ao serviço da web, mesmo que eu tenha lançado explicitamente de volta ao tipo original, tenho o temido:

Use o atributo xmlinclude ou sabão para especificar tipos que não são conhecidos estaticamente.

em referência ao meu tipo derivado.

Resumo do código:

public class DefinedInReferenceCs
{ 
    // ... 
}

public class ClientSubclass : DefinedInReferenceCs
{
    // My extra stuff
}

public class MyClient
{
    public CallTheWebService(ClientSubclass  obj)
    {
        // obj is an instance of ClientSubclass,  cast as DefinedInReferenceCs
        svc.MyMethod((DefinedInReferenceCs)obj); 
        // Throws an exception complaining that ClientSubclass is not statically known
    }
}

Eu posso contornar isso criando explicitamente uma instância do DefinEnReferenceCs e executando uma cópia profunda dos campos relevantes. Existe uma maneira melhor?

Foi útil?

Solução

Como o serializador XML usa a reflexão para trabalhar com objetos, não há como impedir que sua referência de classe base referencia uma instância da sua classe derivada. Sim, você deve usar XmlInclude.

OTOH, você considerou usar classes parciais para adicionar funcionalidade às classes de proxy originais? Dessa forma, você não precisaria de uma aula derivada.

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