Visual Basic .NET Language
Erweiterungsmethoden
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