Konvertierung der selben Klasse in unterschiedlichen Namespaces

realbora

Mitglied
Hallo,

ich habe seit längerer Zeit mehrere Probleme, die ich trotz Google nicht lösen kann.

Szenario:
Ich habe mehrere Projekte (dll's und exe) in einer VS05-Solution. Ein Projekt (dll) beschreibt meine Entitätsklassen. Dieses Projekt referenziere ich in einem Webservice.
Dieser Webservice wird dann wiederum als Verweis in einem anderen Projekt benutzt. Das andere Projekt hat zudem auch einen Verweis auf das Entity-Projekt.

Nun möchte ich in der Anwendung Webservice-Methode aufrufen und dieser ein Objekt aus dem Entity-Projekt übergeben. Dieses Objekt sollte ja auch dem Webservice bekannt sein, da ja auch dieser eine Referenz auf das Entity-Projekt besitzt.

Leider bekomme ich dann immer einen Konvertierungsfehler wie:
Fehler 1 Eine implizite Konvertierung vom Typ "MCW.KeKa.Webservice.Webservice.Beleg" in "MCW.KeKa.Entities.Beleg" ist nicht möglich. J:\Projekte\c#_.net_c++\Visual C#\test\MCW_KeKa_UML\MCW.KeKa.design\Form_Rechnung.cs 137 23 MCW.KeKa.Design


Um das Problem zu umgehen, habe ich auch schon in dem Anwendungsprojekt den Verweis zum Entity-Projekt entfernt und habe nur mit den Objekten aus dem Namespace des Webservices gearbeitet.
Leider habe ich hier das Problem, dass die öffentlichen Methoden der Klassen im Entity-Projekt nicht sichtbar sind, obwohl ich den Webverweis schon aktualisiert, entfernt, ... habe.
Die einzige Möglichkeit, die ich bisher gefunden habe ist, dass ich die Datei Reference.cs von Hand anpasse, sodass die Methoden über diese Proxy-Klasse bekannt sind.
Das kann aber doch nicht die Lösung des Problems sein, oder?

Ich hoffe, dass mir hier jemand weiterhelfen kann.
Vielen Dank.
mfG Realbora
 
Soweit ich das richtig verstanden habe, arbeitest du mit Objekten aus unterschiedlichen Namespaces. Das funktioniert so nicht.

Bedenke: Wenn du zwei Klassen Person hast, die allerdings in unterschiedlichen Namespaces sitzen dann sind beide NICHT vom selben Typ (Der Pfad des Namespaces ist beispielsweise ein Teil des Typs). Ein Casten (Konvertierung) ist daher NICHT möglich.

Für dich bedeutet das, dass du in EINEM Namespace die Klassen hineinpacken musst, die sowohl vom Web Service als auch vom Client verwendet werden.
 
Das mit dem Interface ist gar nicht mal sone schlechte Idee, klappt nur leider nicht.
Wie im obigen Forum beschrieben, gibt es hierfür wohl keine gute Lösung.
 
Wie ich dir oben schon gesagt hab, musst du die gleichen Typen verwenden damit das funktioniert. Du hast aber folgende Typen:

  • MCW.KeKa.Webservice.Webservice.Beleg
  • MCW.KeKa.Entities.Beleg

Auch wenn sie die gleichen Attribute und Eigenschaften besitzen, sind sie doch unterschiedlich. Arbeite im Client als auch im Web Service mit dem gleichen Typ, beispielsweise mit MCW.KeKa.Entities.Beleg. Und wenn du das nicht willst, dann wie der Vorgänger bereits beschrieben hat: Erstelle ein Interface IBeleg, welches die Eigenschaften und Properties, eventuell auch benötigte Methoden beschreibt und arbeite dann damit. Aufrufe sehen dann halt so aus:

Code:
IBeleg myBeleg = MyWebService.GetBeleg(15); // GetBeleg liefert IBeleg zurück
 
Ich glaube, dass du dir mein Problem nicht richtig durchgelesen hast.
Ich möchte dem Webservice eine Klasse aus "MCW.KeKa.Entities" übergeben und keinen Werttyp wie int. Außerdem kann eine Methode aus einem Webservice (zumindest nach meinem Informationsstand) kein Interface als Rückgabetyp haben (nicht serialisierbar).
Vielleicht fällt dir ja noch ne andere Lösung ein, bzw. wenn du Zeit und Lust hast, kannst du dir ja mal nen Beispiel-Szenario basteln.

mfG
Realbora
 
Hi,

Das war nur ein Beispiel zur Veranschaulichung. Natürlich kannst du den Int mit einem beliebigen Typ austauschen. Er muss eben nur serialisierbar sein. In meinem Beispiel fehlt noch ein Cast auf das Interface das ist alles, denn in der Tat wird natürlich ein konkretes Objekt serialisiert und vom WebService gesendet.
 
OK.

Ich kann nur aus meinen Erfahrungen sprechen. Also wie schon gesagt, das mit dem Interface hatte ich schon ausprobiert.
Bekomme aber ne CastException.
 
Dir ist aber schon klar, dass ein Interface vom gleichen Typ verwendet werden muss? Sprich ein Interface, das in EINER Assembly liegt, das von BEIDEN Teilen referenziert wird?
 

Neue Beiträge

Zurück