2009-03-04 3 views
3

В контексте Web Service у меня есть следующий класс, который наследуется от класса Mammal. Класс Mammal определяется в прокси. Я не могу изменить определение этого класса. Поскольку мне нужно добавить некоторые методы в класс Mammal на стороне клиента, я унаследовал Mammal и создал Giraffe.WebService, WebMethod и Inheritance

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

Когда я называю WebMethod, которые ожидают объект типа Млекопитающее, я получаю следующее исключение, говоря мне, что жираф не ожидается.

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

Есть ли обходной путь, который? Я не могу добавить XmlInclude ...

+0

Посмотрите на эту тему http://stackoverflow.com/questions/20084/xml-serialization-and-inherited-types –

ответ

2

Чтобы добавить методы, вы должны использовать частичные классы. Попробуйте добавить второй файл класса с (в правой части пространства имен и т.д.):

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

partial ключевое слово указывает компилятору, чтобы класс должен быть разделен на несколько файлов - идеально подходит для сценариев генерации кода. Однако он требует ключевое слово partial в каждом файле; члены просто объединяются (за исключением частичных методов в C# 3.0, которые имеют собственное тонкое поведение). I Надеюсь,, что wsdl.exe (или что-то еще) включает в себя это!

+0

Я боюсь, что я не могу использовать частичный класс в этом случае. Как изменить класс на сервере? – Martin

+1

Из любопытства, почему бы и нет? В частности, прокси не на сервере ... что вы на самом деле пытаетесь сделать? До сих пор ваше описание примерно «добавляет методы в клиентский веб-сервисный прокси»; частичные классы - правильный ответ для этого сценария ... –

1

Вы должны использовать XmlInclude. Это ваш единственный выбор. Вы должны сказать сериализатору, какой класс вы будете сериализовать, поскольку он должен генерировать код для сериализации.

Это просто поразило меня при написании этого, что вы можете уйти с реализацией Giraffe IXmlSerializable, но это еще больше.

2

Если вы просто хотите добавить методы в класс, который вы не можете изменить, просто создайте методы расширения.

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

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

1

Правильный ответ действительно заключается в использовании частичного класса. Когда вы открываете проект клиента и создаете веб-ссылку, Visual Studio анализирует WSDL и генерирует для вас класс, называемый Mammal. Этот класс доступен только для клиентского проекта, поэтому вам не нужно беспокоиться о стороне сервера.

Скажите, что у вас есть веб-ссылка под названием MyWebService. Тогда будет класс под названием MyWebService.Mammal. Для добавления членов этого класса, все, что вам нужно сделать, это создать новый исходный файл, содержащий это:

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

При вызове метода на вашем веб-сервис, который возвращает Mammal, веб-Reference код будет создан новый экземпляр вашего «улучшенного» класса млекопитающих и скопируйте значения из xml на провод в экземпляр.

 Смежные вопросы

  • Нет связанных вопросов^_^