Visual Basic .NET Language
Uitbreidingsmethoden
Zoeken…
Opmerkingen
Uitbreidingsmethoden zijn methoden ( Sub
of Function
) die functionaliteit toevoegen aan een type (dit kan een referentietype of een waardetype zijn). Deze typen kunnen al dan niet uw eigendom zijn.
Ze kunnen al dan niet deel uitmaken van dezelfde samenstelling als het type dat ze moeten wijzigen. U kunt een opt-in voor uw extensiemethoden toestaan door ze in hun eigen naamruimte te isoleren. Of als u wilt, kunt u ze altijd beschikbaar maken door ze op te nemen in dezelfde naamruimte als het type dat ze wijzigen (ervan uitgaande dat alle montagereferenties aanwezig en correct zijn). Zie het Entity Framework Core 1.0-project op GitHub voor een goed voorbeeld van de opt-in stijl van uitbreidingsmethoden.
Uitbreidingsmethoden in VB hebben enkele vereisten:
- Uitbreidingsmethoden kunnen alleen in modules worden gedeclareerd.
- Uitbreidingsmethoden moeten worden versierd met het kenmerk
Extension()
. - De naamruimte ExtensionAttribute moet beschikbaar zijn in uw module.
Imports System.Runtime.CompilerServices
- De eerste parameter van de methode moet van een type zijn waaraan deze methode wordt gekoppeld.
- De eerste parameter van de methode vertegenwoordigt de instantie waarop deze methode werkt. (Gelijk aan
Me
als dit een echte instantiemethode was). - Een uitbreidingsmethode kan worden opgeroepen als een normale methode door alle parameters op te geven als deze niet op het geïnstantieerde object worden aangeroepen.
Een uitbreidingsmethode maken
Uitbreidingsmethoden zijn nuttig om het gedrag van bibliotheken die we niet bezitten uit te breiden.
Ze worden op dezelfde manier gebruikt als instantiemethoden dankzij de syntactische suiker van de compiler:
Sub Main()
Dim stringBuilder = new StringBuilder()
'Extension called directly on the object.
stringBuilder.AppendIf(true, "Condition was true")
'Extension called as a regular method. This defeats the purpose
'of an extension method but should be noted that it is possible.
AppendIf(stringBuilder, true, "Condition was true")
End Sub
<Extension>
Public Function AppendIf(stringBuilder As StringBuilder, condition As Boolean, text As String) As StringBuilder
If(condition) Then stringBuilder.Append(text)
Return stringBuilder
End Function
Voor een bruikbare extensiemethode heeft de methode het Extension
kenmerk nodig en moet deze in een Module
worden gedeclareerd.
De taal functioneler maken met uitbreidingsmethoden
Een goed gebruik van de extensiemethode is om de taal functioneler te maken
Sub Main()
Dim strings = { "One", "Two", "Three" }
strings.Join(Environment.NewLine).Print()
End Sub
<Extension>
Public Function Join(strings As IEnumerable(Of String), separator As String) As String
Return String.Join(separator, strings)
End Function
<Extension>
Public Sub Print(text As String)
Console.WriteLine(text)
End Sub
Opvullende cijfers
Public Module Usage
Public Sub LikeThis()
Dim iCount As Integer
Dim sCount As String
iCount = 245
sCount = iCount.PadLeft(4, "0")
Console.WriteLine(sCount)
Console.ReadKey()
End Sub
End Module
Public Module Padding
<Extension>
Public Function PadLeft(Value As Integer, Length As Integer) As String
Return Value.PadLeft(Length, Space(Length))
End Function
<Extension>
Public Function PadRight(Value As Integer, Length As Integer) As String
Return Value.PadRight(Length, Space(Length))
End Function
<Extension>
Public Function PadLeft(Value As Integer, Length As Integer, Character As Char) As String
Return CStr(Value).PadLeft(Length, Character)
End Function
<Extension>
Public Function PadRight(Value As Integer, Length As Integer, Character As Char) As String
Return CStr(Value).PadRight(Length, Character)
End Function
End Module
De assemblageversie verkrijgen van een sterke naam
Voorbeeld van het aanroepen van een extensiemethode als een extensie en als een normale methode.
public Class MyClass
Sub Main()
'Extension called directly on the object.
Dim Version = Assembly.GetExecutingAssembly.GetVersionFromAssembly()
'Called as a regular method.
Dim Ver = GetVersionFromAssembly(SomeOtherAssembly)
End Sub
End Class
De uitbreidingsmethode in een module. Maak de module openbaar als extensies zijn gecompileerd naar een dll en waarnaar in een andere assembly wordt verwezen.
Public Module Extensions
''' <summary>
''' Returns the version number from the specified assembly using the assembly's strong name.
''' </summary>
''' <param name="Assy">[Assembly] Assembly to get the version info from.</param>
''' <returns>[String]</returns>
<Extension>
Friend Function GetVersionFromAssembly(ByVal Assy As Assembly) As String
Return Split(Split(Assy.FullName,",")(1),"=")(1)
End Function
End Module