Sök…


Anmärkningar

Förlängningsmetoder är metoder ( Sub eller Function ) som lägger till funktionalitet till en typ (som kan vara en referenstyp eller en värdetyp). Dessa typer kanske inte ägs av dig.

De kan vara eller inte vara i samma enhet som den typ de är avsedd att modifiera. Du kan tillåta en opt-in på dina förlängningsmetoder genom att isolera dem i deras eget namnområde. Eller om du föredrar kan du göra dem alltid tillgängliga genom att inkludera dem i samma namnutrymme som den typ de ändrar (förutsatt att alla monteringsreferenser är på plats och korrekta). Se projektet Entity Framework Core 1.0 på GitHub för ett bra exempel på opt-in-stilen för förlängningsmetoder.

Förlängningsmetoder i VB har några krav:

  • Förlängningsmetoder får endast deklareras i moduler.
  • Extensionsmetoder måste dekoreras med attributet Extension() .
  • Namnområdet för ExtensionAttribute måste vara tillgängligt i din modul.
    Imports System.Runtime.CompilerServices
  • Den första parametern till metoden måste vara av en typ som den här metoden kommer att kopplas till.
  • Den första parametern för metoden kommer att representera förekomsten som den här metoden fungerar på. (Likvärdigt med Me om detta var en riktig instansmetod).
  • En förlängningsmetod kan kallas som en vanlig metod genom att tillhandahålla alla parametrar om det inte anropas till det instanserade objektet.

Skapa en förlängningsmetod

Tilläggsmetoder är användbara för att utvidga beteendet hos bibliotek som vi inte äger.

De används på liknande sätt som instansmetoder tack vare kompilatorns syntaktiska socker:

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

För att ha en användbar förlängningsmetod behöver metoden Extension och måste deklareras i en Module .

Att göra språket mer funktionellt med förlängningsmetoder

En bra användning av förlängningsmetoden är att göra språket mer funktionellt

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

Polstring Numerics

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

Hämta monteringsversion från starkt namn

Exempel på att kalla en förlängningsmetod som en anknytning och som en vanlig metod.

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

Förlängningsmetoden i en modul. Gör modulen offentlig om tillägg kompileras till en dll och hänvisas till i en annan enhet.

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
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow