ERLEDIGT
NEIN
NEIN
ANTWORTEN
10
10
ZUGRIFFE
500
500
EMPFEHLEN
-
Guten Morgen @all,
ich glaube, ich sehe zur Zeit mal wieder den Wald vor lauter Bäumen nicht.
Ich habe in VB .NET eine Klasse ClassicAuthentication, welche ein Interface IAuthentication implementiert. Beide liegen in einer dll.
Wenn ich jetzt in meinem Hauptprogramm allerdings diese nutzen will bekomme ich eine InvalidCastException.
Code :1 2 3
Dim auth As IAuthentication = New ClassicAuthentication() auth.setParams(params) Dim oo As Object() = {src.getParam("IP"), CType(src.getParam("Port"), Short), DirectCast(auth, IAuthentication), src.makeParamString}
Bei dem DirectCast wird mir die Exception geworfen. Weiss jemand, woran das liegen könnte?
Danke, schonmal.
Mfg LuigiEd
-
Hi
Wenn ich es richtig verstanden hab, erfordert DirectCast einen Typ als zweiten Parameter. Ein Interface stellt jedoch keinen Typ dar.
Ich frag mich aber, warum du casten willst. "auth" hat doch schon den "Zieltyp"Grüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
Es sollen später noch weitere Klassen, die IAuthentication implementieren hinzugefügt werden. Ich möchte hier verschiedene Klassen als dll laden, die alle ebenfalls ein Interface (IConnector) implementieren. Bei diesem ist festgelegt, dass die connect-Methode der implementierenden Klasse unter anderem einen Parameter, der die Authentifikation darstellt besitzt. Da es aber verschiedene Authentifizierungsarten gibt (geben soll). Muss der methode eine Klasse, die das IAthentification-Interface implementiert übergeben werden.
Oder gibt es noch einen Weg das anders zu machen?
mfg
Edit: Zieltyp sollte etwas allgemeineres sein, als die konkrete Umsetzung der Authentification. Damit ich das dann, egal, welche konkrete Auth von dem Konnektor verwendet wird , über das Interface auf dessen Methoden zugreifen kann.
In Java kann ich eine Klasse über ein Interface castenGeändert von luigied (26.06.11 um 11:12 Uhr)
-
Aber dafür musst du doch nicht casten.
Du hast ein IAuthentication-Objekt, deine Methode erwartet ein IAuthentication-ObjektGrüße Nico
----------------------
Xing
----------------------
Zitat von Mark Twain (1835-1910)
Zitat von Mike Wilson - Biographie über Larry Ellison (CEO Oracle)
-
Ja, ursprünglich war ich auch dieser Meinung. Habe für diesen speziellen fall zwar jetzt ein notdürftiges workaround gefunden, aber an einer anderen Stelle taucht das Gleiche Problem wieder auf.
Code :1
Dim conn As IConnector = ConnectorMap(Id)
In der ConnectorMap steckt bis dahin ein Objekt von MSSQLConnector.Connectors.MSSQLConnector. Doch an dieser Stelle bekomme ich folgende Exception:
Mein MSSQLConnector implementiert allerdings IConnector und sollte deshalb auch in diesen umgewandelt werden können.Das Objekt des Typs "MSSQLConnector.Connectors.MSSQLConnector" kann nicht in Typ "BasicConnector.IConnector" umgewandelt werden.
Das dürfte doch theoretisch kein Problem sein, oder?
Sollte ich vlt. erwähnen, dass sowohl das Interface, als auch die implemetierende Klasse in externen Bibliotheken liegen? Auf die Interface-Assembly wird jeweils von dem MSSQLConnector- und meinem Hauptprojekt verwiesen.
Der MSSQLConnector liegt dann als Assmbly vor und wird über Reflection geladen nd instanziiert.
mfgGeändert von luigied (27.06.11 um 13:00 Uhr)
-
28.06.11 15:49 #6
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.Warum sollte ein Interface kein Typ sein? DirectCast fordert, dass einer der beiden Typen von dem anderen erbt oder den Typ implementiert.
Du meinst Compiler-Fehler, oder?!
Kann es sein, dass du gehörig mit Namensräumen durcheinander kommst? Und das IConnector in dem Kontext etwas anderes ist als BasicConnector.IConnector?
\edit: Insbesondere (da ich gerade nochmal deine Bemerkung über Reflection gelesen habe) kann es sein, das du das Interface-Assembly neu erstellt hast, aber nicht beide abhängigen Bibliotheken ebenfalls? So dass die Type-ID vom Interface welches MSSQLConnector implementiert ungleich und somit inkompatibel zur Type-ID des Interface in deiner Anwendung ist?
GrußGeändert von deepthroat (28.06.11 um 15:52 Uhr)
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hi deepthroat,
danke für deine Antwort.
Ich hatte extra alle Bibliotheken neu kompiliert. (also die abhängigen als letztes
) Trotzdem hatte ich weiter diese Runtime-Exception
(InvalidCastException) Der Compiler findet den Cast ganz vernünftig und hat mir seinen Segen gegeben, aber irgendwie hat die CLR eben immer das letzte Wort. 
Ich habe jetzt einen kleinen Umweg über Reflections genommen und siehe da: es funktioniert.
Code :1 2 3 4 5
Dim t As Type = ConnectorMap(Id).GetType Dim conn As Object = Activator.CreateInstance(t) conn = ConnectorMap(Id) Dim m As System.Reflection.MethodInfo = t.GetMethod("method") Dim struct As String = m.Invoke(conn, Nothing)
Jetzt würde mich interessieren, in wie weit dieser Weg performance-technisch schlechter ist, als der Cast über das Interface.
mfg LuigiEd
-
29.06.11 08:31 #8
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Hi.Und hast du auch die Referenzen neu gesetzt? Also Assembly-Referenz entfernt, dann neu eingefügt? Und auch in jedem Projekt Debug bzw. Release Builds verwendet?
Vermutlich wird es "performance-technisch" nicht gerade das gelbe vom Ei sein, vor allem ist es aber häßlich
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
Hast du mal die Informationen aus t angeschaut und dann die implementierten Interfaces verglichen mit GetType(IConnector)? Möglicherweise findest du dann Infos was anders ist (Versionsnummer, public key, ...).
Viele Tutorials und Artikel zur Programmierung unter Windows mit C++ und C#. Tägliche Updates und Antworten auf eure Fragen:
Win32Easy - Blog
Es würde mich freuen, wenn ihr einen Kommentar postet!
-
@deepthroat: Hatte ich, dachte ich gemacht. Werd das nochmal überprüfen.
@Muepe32: Das werd ich mir mal ansehen. Klingt gut
Kann es eventuell daran liegen, dass ich hier noch mit .NET 2.0 arbeite? Ist ja auch nicht mehr das Neueste
-
29.06.11 10:57 #11
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
Wenn ich mich recht erinnere hat sich an der CLR nichts geändert zwischen .NET 2.0 und 4.0.
Du könntest ja mal mit dem IL Disasm die Assemblies laden und bei .class bzw. .class interface schauen wie der IL Code aussieht. Die Zahlen in den Kommentaren sollten entsprechend übereinstimmen.
GrußIf at first you don't succeed, try again. Then quit. No use being a damn fool about it.
Ähnliche Themen
-
Hibernate Cast [Ljava.lang.Object; cannot be cast to Data.Data.TeilAufgabe
Von luigied im Forum JavaAntworten: 8Letzter Beitrag: 03.06.10, 22:09 -
IDirect3DDevice9 cast Probleme
Von MedRamBO im Forum C/C++Antworten: 3Letzter Beitrag: 23.02.09, 22:59 -
Probleme mit dynamischem cast
Von Snowcrack im Forum .NET CaféAntworten: 1Letzter Beitrag: 27.01.08, 21:44 -
[AspectJ] Interface Probleme ...
Von TommyMo im Forum JavaAntworten: 4Letzter Beitrag: 06.01.06, 17:28 -
cast
Von masterjcl im Forum C/C++Antworten: 3Letzter Beitrag: 25.11.04, 20:20





Zitieren


Login





