views:

642

answers:

2

In a Web Service context, I have the following class which inherit from the class Mammal. The Mammal class is defined in a proxy. I cannot change the definition of that class. Because I need to add some methods to the class Mammal on the client side, I inherited Mammal and created Giraffe.

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

When I call a WebMethod which expect an object of type Mammal, I get the following exception telling me that Giraffe isn't expected.

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

Is there a workaround that? I cannot really add the XmlInclude...

Thanks!

+1  A: 

To add methods, you should be using partial classes. Try adding a second class file with (in the right namespace etc):

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

The partial keyword tells the compiler to allow the class to be split over multiple files - ideal for code-generation scenarios. It does, however, demand the partial keyword in every file; the members are simply combined (except for partial methods in C# 3.0 which have their own subtle behaviour). I hope that wsdl.exe (or whatever) includes this!

Marc Gravell
I am afraid I cannot use a Partial class in this case. How do I change the class on the server?
Martin
Out of curiosity, why not? In particular, proxies aren't at the server... what is it you are actually trying to do? So far your description is roughly "add methods to the client-side web-service proxy"; partial classes is the correct answer for that scenario...
Marc Gravell
A: 

You have to use XmlInclude. It's your only choice. You have to tell the serializer what class you'll be serializing, since it has to generate the code to do the serialization.

It just struck me while writing this, that you might get away with having Giraffe implement IXmlSerializable, but that's even more work.

John Saunders