Visual Basic .NET Language
Metodi di estensione
Ricerca…
Osservazioni
I metodi di estensione sono metodi ( Sub
o Function
) che aggiungono funzionalità a un tipo (che può essere un tipo di riferimento o un tipo di valore). Questi tipi possono o non possono essere di tua proprietà.
Possono o meno essere nello stesso assieme del tipo che intendono modificare. Puoi consentire l'attivazione dei tuoi metodi di estensione isolandoli nel loro spazio dei nomi. Oppure, se preferisci, puoi renderli sempre disponibili includendoli nello stesso spazio dei nomi del tipo che modificano (assumendo che tutti i riferimenti dell'assembly siano a posto e corretti). Vedere il progetto Entity Framework Core 1.0 su GitHub per un buon esempio dello stile opt-in dei metodi di estensione.
I metodi di estensione in VB hanno alcuni requisiti:
- I metodi di estensione possono essere dichiarati solo in moduli.
- I metodi di estensione devono essere decorati con l'attributo
Extension()
. - Lo spazio dei nomi ExtensionAttribute deve essere disponibile all'interno del modulo.
Imports System.Runtime.CompilerServices
- Il primo parametro del metodo deve essere di un tipo a cui verrà collegato questo metodo.
- Il primo parametro del metodo rappresenterà l'istanza su cui questo metodo opera. (Equivalente a
Me
se questo fosse un metodo di istanza reale). - Un metodo di estensione può essere chiamato come un metodo normale fornendo tutti i parametri se non richiamati sull'oggetto istanziato.
Creare un metodo di estensione
I metodi di estensione sono utili per estendere il comportamento delle librerie che non possediamo.
Sono usati come metodi di istanza grazie allo zucchero sintattico del compilatore:
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
Per avere un metodo di estensione utilizzabile, il metodo richiede l'attributo Extension
e deve essere dichiarato in un Module
.
Rendere la lingua più funzionale con i metodi di estensione
Un buon uso del metodo di estensione è rendere la lingua più funzionale
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
Numeri di imbottitura
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
Ottenere la versione dell'Assembly da un nome sicuro
Esempio di chiamata di un metodo di estensione come estensione e come metodo regolare.
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
Il metodo di estensione in un modulo. Rendi pubblico il modulo se le estensioni sono compilate in una DLL e saranno referenziate in un altro assembly.
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