Unable to cast object of type MyObject Typ MyObject
Habe ich dieses Szenario, in dem eine webservice-Methode, die ich bin, konsumieren in C# gibt ein Business-Objekt beim Aufruf der webservice-Methode mit dem folgenden code bekomme ich die exception "Unable to cast object of type ContactInfo zu geben ContactInfo" in der Referenz.cs Klasse der web-Referenz
Code:
ContactInfo contactInfo = new ContactInfo();
Contact contact = new Contact();
contactInfo = contact.Load(this.ContactID.Value);
Jede Hilfe wäre sehr geschätzt werden.
- Haben Sie aktualisiert Ihre web-Referenz in letzter Zeit?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist, weil einer der
ContactInfo
Objekte ist ein web-service-proxy, und in einem anderen namespace.Es ist ein bekanntes problem mit asmx-style web services. Habe ich In der Vergangenheit implementierten automatischen shallow-copy zu arbeiten, um es (hier ist, wie, obwohl, wenn ich es wieder tun würde ich wahrscheinlich schauen, AutoMapper statt).
Zum Beispiel, wenn Sie eine assembly mit der folgenden Klasse:
und kehren Sie ein Beispiel von einer web-Methode:
Dann, wenn Sie fügen Sie die web-Verweis auf das client-Projekt, bekommen Sie eigentlich dieses:
Dies bedeutet, dass, wenn in Ihrer client-Anwendung, rufen Sie das web-service erhalten Sie eine
ContactInfo
haben Sie diese situation:Es ist auf die Letzte Zeile, die ich meine
ShallowCopy
Klasse:HINWEIS
Das funktioniert nur, weil die proxy-Klasse und die "echten" Klassen haben genau die gleichen Eigenschaften (man generiert sich aus den anderen von Visual Studio).
Als einige der anderen Antworten vorgeschlagen haben, ist es, da .NETTO sieht Sie als zwei verschiedene Klassen. Ich persönlich würde empfehlen, mit so etwas wie AutoMapper. Ich nutze es, und es scheint ziemlich genial. Kopieren Sie Ihre Objekte in 1-2 Zeilen code.
Eigentlich ist dies kein Fehler. Es ist ein problem mit der version, die änderungen von Ihrem eigenen Projekt!
Denn Ihre endgültige ausführen, verwenden Sie nicht die original importierten Referenzen auf kompilieren!
Zum Beispiel, ich war dabei, ein chat-server, - client. Habe ich eine Paket-Struktur zur übertragung von Daten auf client-Projekt.
Dann importiert die gleiche Referenz auf server-Projekt.
Beim casting
Packet packet = (Packet)binaryFormatter.Deserialize(stream);
ich habe den gleichen Fehler. Da die tatsächliche Ausführung Referenz auf server-Projekt ist nicht die Referenz nun im client-Projekt! Da habe ich wieder aufgebaut-client-Projekt oft nach!In Gießen
<new object>=(<new object>) <old object>
immer das neue Objekt muss eine neuere oder die gleiche version wie der alte Objekt!Also, was ich Tat, war, baute ich Sie ein separates Projekt erstellen einer DLL für die Packet-Klasse importiert und die DLL-Datei an beide Projekte.
Wenn ich jede änderung der Packet-Klasse, ich habe zum import der Referenz, um client-und server wieder.
Dann das casting nicht, die obigen Ausnahme!
Wie sind Sie referenzieren die Klasse, die in Ihren web-service-Projekt-als auch consumer-Projekt? Wenn Sie einfach eine Datei verwendet verknüpfen, könnte dies auch erklären, die Ursache des Fehlers. Der Weg serialiasation funktioniert für .NET (Web Services oder sonst glaube ich) ist mit Reflexion zu laden/ausgeben der Daten eines Objekts. Wenn die Dateien einfach verlinkt, dann sind Sie eigentlich immer kompiliert, um verschiedene Typen in unterschiedlichen Assemblys, die erklären, warum Sie den gleichen Namen, können aber nicht wirken zwischen Ihnen. Ich empfehle die Schaffung eines 'Kern' - Bibliothek, die sowohl die web-service-und-consumer-Projekt, Referenzen, und enthält die
ContactInfo
Klasse, die Sie überall verwenden.Dies ist nicht ein problem - es ist ein feature.
Sind Sie zwei unabhängige Klassen. Vergleichen Sie die beiden, und beachten Sie, dass die proxy-Klasse hat keiner der Konstruktoren, Methoden, Indexer, oder andere Verhalten von den ursprünglichen Klasse. Das ist genau das gleiche, was passieren würde, wenn Sie verbraucht die ASMX-service mit einem Java-Programm.
CreateChannel
Methode.Scheint, dass Sie haben zwei Klassen an beiden enden. Ihre Anwendung hat ContactInfo Klasse und webservice-haben auch die Klasse ContactInfo. Die beiden sind zwei völlig verschiedene Klassen. Eine Möglichkeit ist die Verwendung der WebService-Klasse auf Ihrer Seite. Wenn Sie mit ContactInfo in Ihrem web-service haben, dann wird es serialisiert und wird auf der client-Seite zum Einsatz.
Können Sie auch ändern Sie Ihre Referenzen.cs-Datei generiert, die von Visual Studio als web-Referenz Hinzugefügt. Wenn Sie entfernen Sie die proxy-Klassen, generiert, und fügen Sie eine Referenz (using-Anweisungen) zu Ihrem persönlichen Klassen, werden Sie in der Lage verwenden Sie Sie sofort, ohne flache Kopie /spiegelung oder schwere mapping. (aber Sie müssen sich erneut bewerben Sie Ihre änderungen, wenn Sie regenerieren die proxy-layer).
Ich habe auch versucht zu serialisieren Sie die proxy-Objekt und deserialisiert Sie wieder in meinem DTO-Klassen, aber es war ziemlich schwer die Ressourcen klug, also, ich landete ändern die Verweise cs erzeugten Schicht.
Hoffe, es wird helfen, andere Menschen hierher kommen 🙂
Freundlich.