Ich habe ein Webservice-Projekt (alte asmx-Technologie), in dem ich eine Klasse User habe. Diese Klasse verfügt über eine DateTime-Eigenschaft, die das Geburtsdatum dieses Benutzers darstellt. Neben dieser Klasse habe ich eine andere Datei mit einer partiellen Klasse User. In dieser Teilklasse, füge ich eine Eigenschaft ‚Age‘, die das Alter des Benutzers zurückgibt:Teilklassen verloren durch eine Webservice-Referenz
public partial class User
{
public DateTime Age
{
get { return DateTime.Now - this.Birthdate; }
}
}
Der Grund, dass dies in einer partiellen Klasse ist, da der Code Benutzerklasse wird aus einer Konfigurationsdatei automatisch erzeugt, und ich kann dieser Klasse keinen Code hinzufügen, ohne dass sie jedes Mal entfernt wird, wenn der Code generiert wird.
Jetzt in meinem Webservice habe ich eine Webmethode, die eine Liste dieser Benutzer zurückgibt, die sie aus einer Datenbank erhält:
[WebMethod]
public List<User> GetUsers()
{
return Database.LoadUsers();
}
Einfach genug ... Wie auch immer, in einem anderen Projekt jetzt, füge ich einen Dienst Verweis auf diesen Webservice. Es erzeugt den Service-Client und eine Benutzerklasse für mich. Das Problem ist: Diese Benutzerklasse enthält nicht die Eigenschaften, die in der partiellen Klasse definiert sind (Alter in diesem Beispiel) ... Es scheint, dass der Webservice diese Information nicht bekommt.
Natürlich kann ich eine neue partielle Benutzerklasse erstellen und sie im zweiten Projekt neu schreiben, aber ich sollte nicht, sollte ich? Warum erkennt der Webservice die Teilklasse nicht?
Option 1 funktioniert nicht, weil die partielle Klasse sich dann nicht mehr im selben Projekt befindet (und nicht auf die Eigenschaften der eigentlichen Klasse zugreifen kann). Option 2 funktioniert nur für dieses einfache Beispiel und hängt nicht wirklich mit meinem Problem zusammen, ich kann es nicht für mein aktuelles Projekt verwenden. Wenn die partielle Klasse in der Assembly zusammen kompiliert wird, warum sieht die Webservice-Referenz die Eigenschaften in der partiellen Klasse nicht? Sie sollten nach der Kompilierung in der gleichen Klasse sein (zusammen kompiliert!) –
Ich verstehe Option 2, aber Sie sind falsch bei Option 1. Das Hinzufügen als Link ist genau das gleiche wie ** Kopieren der Quelldatei in das neue Projekt, außer es gibt nur eine einzige Instanz der eigentlichen Datei, und Wenn Sie es an einer Stelle ändern, ändert es sich in allen, da es sich um dieselbe Datei handelt. –
Wenn Sie die zweite Servicereferenz hinzufügen, verweisen Sie nicht auf eine Assembly. Sie fügen Ihrem neuen Projekt neuen Quellcode hinzu. Die Proxy-Klasse ist eine separate Datei, wenn Sie eine neue Referenz hinzufügen, daher müssen Sie Ihre Teildatei als ** Link ** hinzufügen. Es handelt sich nicht um eine Kopie, sondern um einen Verweis auf den ursprünglichen Speicherort, der jedoch in beide Projektassemblys kompiliert wird. –