Hi,
ist gar nicht so einfach zu Erkl�ren ;)
CType erwartet als ersten Parameter eine Instanz eines Objekts, dass in den
Typ des 2. Parameters konvertiert werden kann. Ist dies der Fall, so wird
"DAS SELBE" Objekt zur�ckgegeben - nur eben diesmal in einem anderen Typ.
Ein grundlegender Vorteil bei der Verwendung von Schnittstellen ist ja, dass
Du vorher schon wissen kannst, welche Funktionalit�t das daherkommende
Objekt implementiert hat.
Wenn viele verschiedene Objekte IEnumerable implementiert haben, dann kann
Dir egal sein, welches Objekt daherkommt - Du verwendest einfach die
Funktion aus der Schnittstellendefinition.
Man kann auch den Umweg �ber Object gehen - dann ist es allerdings wieder
Deine Aufgabe zu entscheiden, ob die zu verwendende Instanz vom richtigen
Typ ist oder nicht. (Mit der Schnittstelle ist es dem Aufrufer sein
"Problem").
Dir muss dabei auch niemals bewusst sein, welche Objekte alle Deine
Schnittstelle implementiert haben (If..ElseIf im 2. Funktionsblock) - vor
allem kann/soll sich das ja �ndern. Um dies wenigstens Variabel zu halten
gibt's noch die M�glichkeit �ber Try..End Try zuerst einfach mal zu
versuchen, ob eine Umwandlung gl�ckt.
(Mir ist auf die schnelle kein besseres Beispiel eingefallen *g*)
Sub ResetEnumerator(AnyIEnumerable As IEnumerable)
AnyIEnumerable.GetEnumerator().Reset
End Sub
Sub ResetEnumerator(PleaseOnlyIEnumerable As Object)
If TypeOf PleaseOnlyIEnumerable Is Array Then
CType(PleaseOnlyIEnumerable, _
Array).GetEnumerator().Reset
ElseIf TypeOf PleaseOnlyIEnumerable Is ArrayList Then
CType(PleaseOnlyIEnumerable, _
ArrayList).GetEnumerator().Reset
ElseIf TypeOf PleaseOnlyIEnumerable Is AttributeCollection Then
CType(PleaseOnlyIEnumerable, _
AttributeCollection).GetEnumerator().Reset
ElseIf
'...
End If
' oder (in dem Fall wohl besser - aber noch lange nicht sch�n)
Dim x As IEnumerable 'wird hier trotzdem nochmal verwendet.
Try
x = CType(PleaseOnlyIEnumerable, IEnumerable)
x.GetEnumerator().Reset
Catch
End Try
End Sub
Letztendlich kann man das auch mit einer �berladung der Funktion erreichen.
Aber auch hier muss man dann wissen, welche Objekte alle diese Funktion
implementiert haben..
Zu Deinem Beispiel.
GetService gibt ein Objekt vom Typ Object zur�ck. Dieses Objekt ist - soviel
wird in der Doku zugesichert(ansonsten m�sste man dies �berpr�fen!) ein
"Dienstobjekt" dessen Typ der gleiche ist, wie der, der in dem mitgegebene
System.Type-Objekt beschrieben wird.
Innerhalb der Funktion wird also Anhand des mitgegebenen Typs
(IWindowsFormsEditorService) ein neues Objekt ausgew�hlt/erstellt und
zur�ckgegeben. Dies kann auch Nothing sein, wenn die Funktion den Typ nicht
finden kann..
'Ganz bl�de implementiert w�rde Die Funktion ungef�hr so aussehen ;)
Function GetService(ServiceType As System.Type) As Object
If ServiceType Is GetType(INimmMich) Then
Return New NimmMich(123) 'Implementiert INimmMich
ElseIf ServiceType Is GetType(INimmAuchMich) Then
Return New NimmAuchMich(129) 'Implementiert INimmAuchMich
Else
Return Nothing
End If
End Function
Deine Objektinstanz wird also innerhalb der Funktion erstellt.
Der Aufruf erfolgt dann ca. so:
Dim requestedType As System.Type = GetType(INimmAuchMich)
Dim returnedObject As Object = GetService(requestedType)
Dim f As INimmAuchMich = CType(returnedObject, INimmAuchMich)
Und das gleiche in Kurzform
Dim f As INimmAuchMich = CType(GetService(GetType(INimmAuchMich)),
INimmAuchMich)
Nun. Auf jeden Fall bekommst Du nach dem Aufruf von GetService() ein Objekt
vom Typ Object geliefert und kannst demzufolge nur wenig damit anstellen
(ToString, GetType und die paar wenigen Funktionen eben).
Du wei�t eigentlich nur eins. Dieses Objekt IST VON DEM TYP, den Du
mitgegeben hast(das hat Dir der Bereitsteller der Funktion fest versprochen)
und kann demzufolge auch in diesen Typ umgewandlelt werden - Und genau das
machst Du jetzt auch gleich, um wenigstens die Funktionen aus der
Schnittstelle verwenden zu k�nnen.
"M�glicherweise" kann das gelieferte Objekt noch mehr. Man wei� es erst,
wenn man nachschaut.
-------
Wenn die Funktion nun B�se w�re, w�rde der zur�ckgegebene Typ mit dem in
ServiceType angegebenen Typ nichts anfangen k�nnen und Deine direkt danach
erfolgende Umwandlung in eben genau diesen Typ geht wieder schief.
So b�se Funktionen sieht man aber selten...
-------
Wir halten nochmal Fest. Die Funktion GetType liefert ein neues Objekt vom
Typ System.Type. Diesem Objekt kann man Informationen zum angegebenen Typ
entlocken. Ein Typ ist keine Instanz! Das System.Type-Objekt wird anhand
einer Namensaufl�sung erstellt. Type.GetType(s) erwartet zum Beispiel einen
vollst�ndigen Namen als Parameter.
Beide liefern das gleiche (System.Type)-Objekt zur�ck!!
Type.GetType("System.Int32").IsValueType = True
GetType(System.Int32).IsValueType = True
GetType(System.Int32) Is Type.GetType("System.Int32") = True
Eine eigene Implementierung kann so wie unten aussehen (wobei das
vollkommener Quatsch w�re. Nur zur Veranschaulichung *g*)
Function GetTypeByName(x As String) As MyOwnTypeInfo
' MyOwnTypeInfo als Ersatz f�r System.Type
Dim ret As New MyOwnTypeInfo
Select Case "x"
Case "Integer"
ret.FullName = "System.Int32"
ret.IsValueType = True
Case "String"
ret.FullName = "System.String"
ret.IsValueType = False
End Select
Return ret
End Function
Der Typ und die Instanz haben also nur wenig miteinander zu tun.
System.Type hat mit der Instanz (eigentlich) gar nichts mehr zu tun.
Typ und System.Type darf man daher auch nicht verwechseln.
Das eine ist der Typ, das andere sind Informationen �ber einen Typ. Und
genau deswegen schreib ich auch immer "System." davor.
Ist noch irgendetwas klar?? Wolfgang ;)
http://www.vbwelt.de/
-----Urspr�ngliche Nachricht-----
Von: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED] Im
Auftrag von Oskar Vaia
Gesendet: Freitag, 4. Juni 2004 11:33
An: [EMAIL PROTECTED]
Betreff: AW: [Vb.net] GetType(IWindowsFormsEditorService)
Hallo Wolfgang,
Gut Ding hat gut Weile! :)
Sorry, aber bitte etwas Geduld:
Hier mal der Code aus der Beispielanwendung:
Public Overloads Overrides Function EditValue(ByVal context As
ITypeDescriptorContext, ByVal provider As IServiceProvider, ByVal value As
Object) As Object
If Not (context Is Nothing) And Not (provider Is Nothing) Then
' Access the property browser's UI display service,
' IWindowsFormsEditorService
Dim eS As New i
Dim editorService As IWindowsFormsEditorService =
CType(provider.GetService(GetType(IWindowsFormsEditorService)),
IWindowsFormsEditorService)
If Not (editorService Is Nothing) Then
' Create an instance of the UI editor, passing a reference
to
' the editor service
Dim dropDownEditor As New UserControl1(editorService)
' Pass the UI editor the current property value
dropDownEditor.Face = CType(value, Int16) + 2
' Display the UI editor
dropDownEditor.EditorService = editorService
editorService.DropDownControl(dropDownEditor)
' Return the new property value from the editor
Return dropDownEditor.Face
End If
End If
Return MyBase.EditValue(context, provider, value)
End Function
Die Variable "editorService" muss irgendwie doch eine Instanz erhalten,
sonst kann sie ja �ber keine Funktionalit�t verf�gen. Wo geschieht das denn
nun hier, wenn nicht bei der Variablendeklaration?
Gr��e
Oskar
_______________________________________________
Vb.net Mailingliste, Postings senden an:
[EMAIL PROTECTED]
An-/Abmeldung und Suchfunktion unter:
http://www.glengamoi.com/mailman/listinfo/vb.net