Laden...

Typ Konvertierung: Verschiedene Typen, die aber gleich implementiert sind, ineinander umwandeln

Erstellt von tequila slammer vor 12 Jahren Letzter Beitrag vor 12 Jahren 1.851 Views
T
tequila slammer Themenstarter:in
253 Beiträge seit 2006
vor 12 Jahren
Typ Konvertierung: Verschiedene Typen, die aber gleich implementiert sind, ineinander umwandeln

Hallo Forum,

ich habe folgendes Problem bei einem Plug-In System für Datenimporte.
Die PlugIns implementieren eine Methode public List<IContact> LoadData(string path) die vom PlugIn Host aufgerufen wird um die Daten entgegenzunehmen.

Die Daten müssen dann an einen Webservice weitergegeben werden damit sie zentral gespeichert werden können. Und hier tritt mein Problem auf.

Die Daten vom PlugIn implementieren alle IContact. Die Transferobjekte des Webservice tun dies auch nur wissen sie das auf Grund der Proxy-Klassen nicht.

Wie kann ich - ohne großen Aufwand zu betreiben - die Daten einfach an die Webservice Methode SaveContact(Contact contact) übergeben?

Versucht habe ich es schon so:


Service.SaveContact((Service.Contact) iContactObject);

Hier kann er den Typ jedoch nicht wandeln.


Service.SaveContact(iContactObject as Service.Contact);

Hier kann er den Typ auch nicht wandeln und gibt NULL zurück.

5.742 Beiträge seit 2007
vor 12 Jahren

Die Transferobjekte des Webservice tun dies auch nur wissen sie das auf Grund der Proxy-Klassen nicht.

Wie meinst du das?
Übergib doch einfach die "inneren" Objekte.

Bzw: Wie soll eine Klasse etwas implementieren "ohne es zu wissen"?

849 Beiträge seit 2006
vor 12 Jahren

Hallo,

du musst bevor Du die Service Referenz generierst, die Assembly mit IContact referenzieren und dann beim erstellen sagen, das er bitte die Assemblys auch benutzt, und nicht neu gereriert.

Oder einfach IContact der Proxy Klassen benutzen.

T
tequila slammer Themenstarter:in
253 Beiträge seit 2006
vor 12 Jahren

Ich meine damit, dass die IContact Objekte die gleichen Properties enthalten wie das Objekt, das der Service erwartet. Beides sind Transferobjekte und haben somit keine von mir erstellten Methoden.

Das Service Objekt würde also auch das IContact Interface implementieren. Allerdings tut es das nicht, weil durch die Serialisierung und durch die Proxy-Generierung vom VisualStudio diese Information verloren geht.

Wie kann ich denn die "inneren" Objekte übergeben, wenn Sie laut Compiler nicht vom gleichen Typ sind - in ihrer Implementierung aber schon? Genau das ist doch mein Problem.

@unconnected: Das habe ich jetzt nicht verstanden.

849 Beiträge seit 2006
vor 12 Jahren

Du hast die Möglichkeit, das beim generieren des CLients wirklich die Klassen benutzt werden, die Du geschrieben hast, und keine neu Generierten.

Musst natürlich dann deine Datenklasse in eine eigene Assembly auslagern.

T
tequila slammer Themenstarter:in
253 Beiträge seit 2006
vor 12 Jahren

Hast du irgendwo ein Link wo das näher beschrieben ist? Ich habe mir mal die Service Reference Konfiguration angesehen und damit etwas rumgespielt. Anschließend ging nichts mehr 8o also wieder alles zurück gestellt. 🙁

5.742 Beiträge seit 2007
vor 12 Jahren

Allerdings tut es das nicht, weil durch die Serialisierung und durch die Proxy-Generierung vom VisualStudio diese Information verloren geht.

Hmm - sicher, dass man das nicht irgendwo anpassen kann?
Evtl. via partial class?

//EDIT: Mit der WCF kenne ich mich nicht allzugut aus, aber evtl. hilft die in Is it possible to generate automatically a WCF proxy with custom code? genannte _ChannelFactory _weiter.

T
tequila slammer Themenstarter:in
253 Beiträge seit 2006
vor 12 Jahren

Ich denke gerade darüber nach mir Extension Method zu schreiben, die dann die Wertzuweisungen übernehmen. Eigentlich muss es doch auch anders gehen als so:


public static Service.Contact ToServiceContact(this IContact contact)
{
   return new Service.Contact(){FistName = contact.FirstName,...};
}
742 Beiträge seit 2005
vor 12 Jahren

+1 to unconnected, ist wirklich die einfachste Alternative

849 Beiträge seit 2006
vor 12 Jahren

Hallo,

nen besseren Link hab ich jetzt auf die schnelle nicht gefunden..

reuse referenced assemblys

T
tequila slammer Themenstarter:in
253 Beiträge seit 2006
vor 12 Jahren

Das ist genau das was ich probiert hatte. Ich habe jedoch die Einschränkung das meine Klassen nicht ausgelagert sind. Da dieser Milenstein bis Montag fertig sein muss werde ich das in einem späteren Release gerade ziehen.

Danke aber schon einmal für die Hilfe.