2016-06-08 3 views
1

Я импортировал стороннего пользователя WSDL (через ссылку «Сервис») в проект «Консольное приложение» для отправки и получения данных через веб-службы. Чтобы заставить это функционировать должным образом, мне пришлось добавить код в файл Reference.cs, связанный с веб-службой. Хотя это работает, если обновление сделано в WSDL, и я повторно импортирую/создаю эту ссылку на службы, этот код обхода исчезнет.Переопределение порожденного частичного класса

Чтобы обойти это, я сохранил необходимые изменения кода во внешний текстовый файл, сохраненный в проекте.

Мне любопытно, знает ли кто-нибудь, каким образом я мог бы записать эти изменения в свой отдельный класс вне справочной службы и все же ссылаться на ссылку на службу, используя, таким образом, код, необходимый для отправки/получения с веб-службы.

У меня есть два класса (не включены в сгенерированный код), которые я могу ссылаться в сгенерированном коде после их разделения в свой собственный файл .cs и ссылаясь на namespace, используемый в справочной службе.

То, что я хотел бы сделать, если это возможно, заключается в следующем:


Общая цель:
Добавить пользовательский код в код, генерируемый путем импорта третьей стороной WSDL как справочная служба, таким образом, когда WSDL обновляется сторонним разработчиком, другой разработчик не должен обязательно помнить, чтобы погрузиться в файл Reference.cs справочной службы и заменить/добавить конкретный код.

Для достижения этой цели, я должен быть в состоянии:

  1. Заменить существующее свойство и связанного с ним поля генерируемого partial class с заказной версии (см Snippet # 1 ниже).
  2. Замените существующий сгенерированный partial class на индивидуальную версию класса, имеющую другое определение атрибута и несколько отличающиеся определения свойств/полей.

Отрывок # 1

Заменить следующее:

private byte[] bulkExchangeFileField; 

[System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:us:gov:treasury:irs:common", DataType = "base64Binary", Order = 0)] 
public byte[] BulkExchangeFile 
{ 
    get { return this.bulkExchangeFileField; } 
    set 
     { 
      this.bulkExchangeFileField = value; 
      this.RaisePropertyChanged("BulkExchangeFile"); 
     } 
    } 

с этой версией свойств/полей, которые работали когда-то я изменил сгенерированный код:

private BulkExchangeFileType bulkExchangeFileField; 

[System.Xml.Serialization.XmlElementAttribute(Namespace = "urn:us:gov:treasury:irs:common", Order = 0)] 
public BulkExchangeFileType BulkExchangeFile 
{ 
    get { return this.bulkExchangeFileField; } 
    set 
    { 
     this.bulkExchangeFileField = value; 
      this.RaisePropertyChanged("BulkExchangeFile"); 
    } 
} 

ответ

0

Используйте методы расширения и/или перегружайте свойства в встроенном классе, поэтому ваш код не будет заменен. перегружать свойства вам просто нужно, чтобы объявить его словом новый перед публикой, как в: new public BulkExchangeFileType BulkExchangeFile, поэтому при использовании объекта он будет вызывать свои свойства, а не те, которые определены с помощью веб-сервиса

и вот как создавать методы расширения https://msdn.microsoft.com/library/bb383977.aspx

class Program 
{ 
    static void Main(string[] args) 
    { 
     InheredClass test = new InheredClass(); // Do this 
     BaseClass test2 = new InheredClass(); // don't do this 

     Console.WriteLine(test.MyProperty.GetType()); 
     Console.WriteLine(test2.MyProperty.GetType()); 
     Console.Read(); 
    } 


    class BaseClass 
    { 
     public int MyProperty { get; set; } 
    } 

    class InheredClass : BaseClass 
    { 
     new public decimal MyProperty { get; set; } 
    } 
} 
+0

Спасибо за ваш ответ. Я не уверен, что полностью понимаю, что вы говорите о перегрузке свойств. Сможете ли вы отредактировать свой ответ, чтобы предоставить какие-либо примеры/образцы? Я хочу заменить одно свойство другим типом: свойство, определенное как 'byte []', с именем, определенным как 'BulkExchangeFileType'. Я обновил свой пост с более подробной информацией о том, что я ищу. – Russ

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