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

Odpovedet emailem