2016-06-08 18 views
1

Ich habe einen Drittanbieter WSDL (über Service-Referenz) in mein Konsolenanwendungsprojekt importiert, um Daten über Webdienste zu senden und zu empfangen. Damit dies ordnungsgemäß funktioniert, musste ich der Datei Reference.cs, die dem Webdienst zugeordnet ist, Code hinzufügen. Während dies funktioniert, wird, wenn eine Aktualisierung an der WSDL vorgenommen wird und ich diese Service-Referenz erneut importiere/generiere, dieser Umgehungscode wegfallen.Überschreiben einer generierten partiellen Klasse

Um dies zu umgehen, habe ich die notwendigen Code-Änderungen in eine externe Textdatei gespeichert, die im Projekt gespeichert ist.

Ich bin neugierig, wenn jemand weiß, wie ich diese Änderungen in eine eigene separate Klasse schreiben könnte, außerhalb der Service-Referenz, und noch immer von der Service-Referenz referenziert, so dass die "richtige" Code, der zum Senden/Empfangen vom Web-Service benötigt wird.

Ich habe zwei Klassen (nicht im generierten Code enthalten), die ich im generierten Code referenzieren kann, nachdem ich sie in ihre eigene .cs Datei getrennt habe und auf die namespace der Service-Referenz verweist.

Was ich tun möchte, wenn möglich, ist die folgende:


Insgesamt Ziel:
benutzerdefinierten Code hinzufügen durch den Import eines Drittanbieter WSDL als Service Referenz generierte Code, die Art und Weise, wenn Die WSDL wird von Drittanbietern aktualisiert, ein anderer Entwickler muss sich nicht unbedingt daran erinnern, in die Datei Reference.cs der Service-Referenz einzutauchen und spezifischen Code zu ersetzen/hinzuzufügen.

dieses Ziel zu erreichen, muss ich in der Lage sein:

  1. Ersetzen Sie eine vorhandene Eigenschaft und zugehörige Feld der erzeugten partial class, mit einer angepassten Version (siehe Snippet # 1 unten).
  2. Ersetzt eine vorhandene generierte partial class durch eine angepasste Version der Klasse mit einer anderen Attributdefinition und etwas anderen Eigenschaften/Felddefinitionen.

Snippet # 1

Ersetzen Sie die folgenden Schritte aus:

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"); 
     } 
    } 

mit dieser Version der Eigenschaften/Felder, die einst gearbeitet geändert ich den generierten Code:

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"); 
    } 
} 

Antwort

0

Verwenden Sie Erweiterungsmethoden und/oder überlasten Sie die Eigenschaften in einer inhered Klasse, so dass Ihr Code nicht ersetzt wird. Um die Eigenschaften überlasten Sie brauchen nur mit dem Wort vor der Öffentlichkeit neu zu erklären, wie in: new public BulkExchangeFileType BulkExchangeFile, also, wenn Sie das Objekt verwenden, wird es Ihre Eigenschaften stattdessen durch den Web-Service

und hier ist definiert diejenigen nennen, wie man Erstellen Sie Erweiterungen Methoden 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

Vielen Dank für Ihre Antwort. Ich bin mir nicht sicher, ob ich vollständig verstehe, was Sie über das Überladen der Eigenschaften sagen. Können Sie Ihre Antwort bearbeiten, um Beispiele/Beispiele zur Verfügung zu stellen? Ich möchte eine Eigenschaft durch die eines anderen Typs ersetzen: eine Eigenschaft, die als 'byte []' definiert ist, wobei eine als 'BulkExchangeFileType' definiert ist. Ich habe meinen Beitrag mit weiteren Einzelheiten aktualisiert, wonach ich suche. – Russ

Verwandte Themen