Erweiterungsmethoden

06/02/2010 - 19:48 von Klaus Pater | Report spam
Hallo & guten Tag zusammen

ich habe da ein kleines Verstàndnisproblem:

Folgende Konstruktion:

'=Public Class ClassTE
Shared Sub t123()
Dim i As Integer = 0
Dim s As String = "Halli"
Dim b As Boolean = False
Dim c As New abc
Dim o As Object = "Hurra"

Console.WriteLine(i.MyDummy)
Console.WriteLine(b.MyDummy)
Console.WriteLine(s.MyDummy)
Console.WriteLine(c.x.MyDummy)
Try
Console.WriteLine(o.MyDummy)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
' auch für o3 oder o=true
End Sub
End Class
Class abc
Public x As String = "Hallo"
Public y As Integer = 0
End Class
Module MyExt
<System.Runtime.CompilerServices.Extension()> _
Public Function MyDummy(ByVal o As Object) As String
Return "<1: " & CType(o, String) & "/>"
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Function MyDummy(ByVal o As Boolean) As String
Return "<2: " & CType(o, String) & "/>"
End Function
<System.Runtime.CompilerServices.Extension()> _
Public Function MyDummy(ByVal o As String) As String
Return "<3: " & o & "/>"
End Function
End Module
'=
Und dies ergibt folgende Ausgabe:

<1: 0/>
<2: False/>
<3: Halli/>
<3: Hallo/>
Der offentliche Member MyDummy für den Typ String wurde nicht gefunden.
Der offentliche Member MyDummy für den Typ Integer wurde nicht gefunden.
Der offentliche Member MyDummy für den Typ Boolean wurde nicht gefunden.

Lasse ich die zweite und dritte "Extension" weg, werden die ersten 4
Aufrufe auch korrekt über die erste "Extension" verarbeitet.

Deklariere ich ein Object und weise dem ein Wert zu, kommt es immer zu
einem Fehler, auch wenn die ggf. passende "Extension" vorhanden ist.

Rufe ich im Debugmodus im Direkfenster o.MyDummy auf, funktioniert es
erstaunlicherweise ohne Fehler.

Auch fehlt Intellisense bei ... o.MyDummy, die Kompilierung weist aber
keinen Fehler auf.

Ersatzlösungen sind schon klar, aber irgendwie finde ich es (mich) Blöde ;-)

Gruß
Klaus
 

Lesen sie die antworten

#1 Armin Zingler
06/02/2010 - 20:30 | Warnen spam
Klaus Pater schrieb:

Und dies ergibt folgende Ausgabe:



Bei mir gibt gar nichts aus weil es nicht kompilierbar ist:

Console.WriteLine(o.MyDummy)

o is vom Typ Object. Der Typ hat kein Member namens MyDummy.

Schalte bitte Option Strict ein, sonst ist jede Frage zu Datentypen
eine reine Farce.



Armin

Ähnliche fragen