Visual Basic .NET Language
Förlängningsmetoder
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