Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Когда вы вызываете метод веб-службы, который возвращает Mammal, код веб-ссылки создаст новый экземпляр вашего «улучшенного» класса Mammal и скопирует значения из XML-файла, передаваемого по сети, в этот экземпляр.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top