Передача производного класса методу веб-службы в качестве базового класса

У меня есть класс C #, импортированный из веб-службы. Из-за проблем с отладкой и массивов мне нужно, чтобы этот класс имел переопределение ToString() или DebuggerDisplayAttribute, и единственный способ, который я нашел, - это добавить первое к производному классу:

class ExtWebServiceDataClass: WebServiceDataClass
{
    public override string ToString()
    {
        return String.Format("stuff");
    }
}

К сожалению, методы веб-сервиса требуют массив базовых объектов и не принимают массив производных объектов (ошибка сериализации XML):

System.InvalidOperationException: ошибка при создании XML-документа.

System.InvalidOprrationException: тип ExtWebServiceDataClass не ожидался. Используйте атрибут XmlInclude или SoapInclude, чтобы указать типы, которые не известны статически.

Есть ли способ заставить его принять его со стороны клиента? Атрибут с надписью it's just like the base class, just serialize it as such?

Или простой способ массового преобразования производного класса в базовый?

Или, проще говоря, другой способ иметь ToString переопределение или DebuggerDisplayAttribute на стороне клиента?


person Medinoc    schedule 10.04.2013    source источник
comment
Что точно представляет собой ошибку сериализации?   -  person Jon Skeet    schedule 10.04.2013
comment
Я лично предлагаю вам удалить этот вопрос и задать более подробный, когда вы вернетесь на работу. Иначе, возможно, будем гадать.   -  person Jon Skeet    schedule 10.04.2013
comment
Я воспроизвел ошибку дома и добавил сообщение об ошибке.   -  person Medinoc    schedule 11.04.2013
comment
Вы говорите, что хотите отправить тип, определенный на клиенте, на сервер - и выполнить переопределение ToString на сервере? Или переопределение ToString предназначено только для отладки на стороне клиента?   -  person Jim W says reinstate Monica    schedule 23.04.2013
comment
Переопределение ToString предназначено только для отладки на стороне клиента.   -  person Medinoc    schedule 23.04.2013
comment
WebServiceDataClass объявлен как partial class в сгенерированном файле? Если да, вы можете определить свой DebuggerDisplayAttribute в другом файле.   -  person Tim S.    schedule 23.04.2013
comment
@TimS. Ооо, ты прав. Совершенно верно, он действительно объявлен как partial, поэтому я мог бы добавить к нему свое ToString переопределение (и все, что мне угодно). Пожалуйста, опубликуйте свой комментарий как ответ, чтобы я мог наградить вас наградой.   -  person Medinoc    schedule 23.04.2013
comment
Вы можете использовать AutoMapper для сопоставления производного класса с базовым классом. Должен решить вашу проблему, хотя и не самое элегантное решение.   -  person Alxandr    schedule 23.04.2013


Ответы (1)


WebServiceDataClass объявлен как partial class в сгенерированном файле (как и большинство сгенерированных классов). Вы можете определить свой DebuggerDisplayAttribute или ToString в другом файле в тот же проект, вот так:

[DebuggerDisplay("MyString")]
public partial class WebServiceDataClass
{
}
person Tim S.    schedule 23.04.2013
comment
Спасибо, это отлично работает, по крайней мере, для моих клиентов Application и DLL. В меньшей степени для клиентов веб-сайтов (их веб-ссылки считаются отдельными сборками), но я могу переместить соответствующий код в DLL, и он работает. - person Medinoc; 23.04.2013