Suche…


Bemerkungen

Erweiterungsmethoden sind Methoden ( Sub oder Function ), die einem Typ Function hinzufügen (dies kann ein Referenztyp oder ein Werttyp sein). Diese Typen können Ihnen gehören oder nicht.

Sie befinden sich möglicherweise in derselben Baugruppe wie der Typ, den sie ändern möchten. Sie können ein Opt-In für Ihre Erweiterungsmethoden zulassen, indem Sie sie in ihrem eigenen Namespace isolieren. Wenn Sie möchten, können Sie sie immer verfügbar machen, indem Sie sie in demselben Namespace wie der Typ angeben, den sie ändern (vorausgesetzt, dass alle Assemblyreferenzen vorhanden und korrekt sind). Ein gutes Beispiel für den Opt-In-Stil von Erweiterungsmethoden finden Sie im Entity Framework Core 1.0-Projekt auf GitHub.

Erweiterungsmethoden in VB haben einige Anforderungen:

  • Erweiterungsmethoden dürfen nur in Modulen deklariert werden.
  • Erweiterungsmethoden müssen mit dem Extension() Attribut versehen werden.
  • Der ExtensionAttribute-Namespace muss in Ihrem Modul verfügbar sein.
    Imports System.Runtime.CompilerServices
  • Der erste Parameter der Methode muss von einem Typ sein, an den diese Methode angehängt wird.
  • Der erste Parameter der Methode repräsentiert die Instanz, für die diese Methode ausgeführt wird. (Entspricht Me wenn dies eine echte Instanzmethode wäre).
  • Eine Erweiterungsmethode kann als reguläre Methode aufgerufen werden, indem alle Parameter angegeben werden, sofern sie nicht für das instanziierte Objekt aufgerufen werden.

Erweiterungsmethode erstellen

Erweiterungsmethoden sind nützlich, um das Verhalten von Bibliotheken zu erweitern, die uns nicht gehören.

Sie werden dank des syntaktischen Zuckers des Compilers ähnlich wie die Instanzmethoden verwendet:

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 eine verwendbare Erweiterungsmethode benötigt die Methode das Extension und muss in einem Module deklariert werden.

Die Sprache mit Erweiterungsmethoden funktioneller machen

Eine gute Verwendung der Erweiterungsmethode besteht darin, die Sprache funktionaler zu gestalten

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

Padding 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

Montageversion von einem starken Namen abrufen

Beispiel für den Aufruf einer Erweiterungsmethode als Erweiterung und als reguläre 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

Die Erweiterungsmethode in einem Modul. Machen Sie das Modul öffentlich, wenn Erweiterungen zu einer DLL kompiliert werden und in einer anderen Assembly referenziert werden.

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
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow