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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow