Recherche…


Remarques

Les méthodes d'extension sont des méthodes ( Sub ou Function ) qui ajoutent des fonctionnalités à un type (qui peut être un type de référence ou un type de valeur). Ces Types peuvent ou non vous appartenir.

Ils peuvent ou peuvent ne pas être dans le même assemblage que le type qu'ils sont destinés à modifier. Vous pouvez autoriser un opt-in à vos méthodes d'extension en les isolant dans leur propre espace de noms. Ou, si vous préférez, vous pouvez les rendre toujours disponibles en les incluant dans le même espace-nom que le type qu'ils modifient (en supposant que toutes les références d'assemblage sont en place et correctes). Voir le projet Entity Framework Core 1.0 sur GitHub pour un bon exemple du style opt-in des méthodes d'extension.

Les méthodes d'extension dans VB ont quelques exigences:

  • Les méthodes d'extension ne peuvent être déclarées que dans des modules.
  • Les méthodes d'extension doivent être décorées avec l'attribut Extension() .
  • L'espace de noms ExtensionAttribute doit être disponible dans votre module.
    Imports System.Runtime.CompilerServices
  • Le premier paramètre de la méthode doit être d'un type auquel cette méthode sera associée.
  • Le premier paramètre de la méthode représentera l'instance sur laquelle cette méthode fonctionne. (Équivalent à Me si c'était une méthode d'instance réelle).
  • Une méthode d'extension peut être appelée comme méthode régulière en fournissant tous les paramètres si elle n'est pas appelée sur l'objet instancié.

Créer une méthode d'extension

Les méthodes d'extension sont utiles pour étendre le comportement des bibliothèques que nous ne possédons pas.

Ils sont utilisés de manière similaire aux méthodes d'instance grâce au sucre syntaxique du compilateur:

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

Pour avoir une méthode d'extension utilisable, la méthode nécessite l'attribut Extension et doit être déclarée dans un Module .

Rendre le langage plus fonctionnel avec les méthodes d'extension

Un bon usage de la méthode d'extension est de rendre le langage plus fonctionnel

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

Rembourrage numérique

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

Obtenir la version d'assemblage à partir d'un nom fort

Exemple d'appeler une méthode d'extension en tant qu'extension et méthode régulière.

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

La méthode d'extension dans un module. Rendez le module Public si les extensions sont compilées dans une DLL et seront référencées dans un autre 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
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow