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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow