Buscar..


Observaciones

Los métodos de extensión son métodos ( Sub o Function ) que agregan funcionalidad a un Tipo (que puede ser un Tipo de Referencia o un Tipo de Valor). Estos tipos pueden o no ser propiedad de usted.

Pueden o no estar en el mismo ensamblaje que el Tipo que están diseñados para modificar. Puede permitir una suscripción a sus métodos de extensión aislándolos en su propio espacio de nombres. O si lo prefiere, puede hacer que estén siempre disponibles incluyéndolos en el mismo espacio de nombres que el Tipo que modifican (suponiendo que todas las referencias de ensamblaje estén en su lugar y sean correctas). Vea el proyecto Entity Framework Core 1.0 en GitHub para ver un buen ejemplo del estilo opt-in de los métodos de extensión.

Los métodos de extensión en VB tienen algunos requisitos:

  • Los métodos de extensión solo pueden ser declarados en módulos.
  • Los métodos de extensión deben estar decorados con el atributo Extension() .
  • El espacio de nombres del atributo de extensión debe estar disponible dentro de su módulo.
    Imports System.Runtime.CompilerServices
  • El primer parámetro del método debe ser de un tipo al que se adjuntará este método.
  • El primer parámetro del método representará la instancia en la que este método opera. (Equivalente a Me si este fuera un método de instancia real).
  • Se puede llamar a un método de extensión como un método regular al proporcionar todos los parámetros si no se llama en el objeto instanciado.

Creando un método de extensión

Los métodos de extensión son útiles para extender el comportamiento de las bibliotecas que no poseemos.

Se utilizan de forma similar a los métodos de instancia gracias al azúcar sintáctico del compilador:

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

Para tener un método de extensión utilizable, el método necesita el atributo Extension y debe declararse en un Module .

Haciendo el lenguaje más funcional con métodos de extensión.

Un buen uso del método de extensión es hacer que el lenguaje sea más funcional.

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

Numéricos de relleno

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

Obtención de la versión de montaje de nombre fuerte

Ejemplo de llamar a un método de extensión como una extensión y como un método regular.

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

El método de extensión en un módulo. Haga que el módulo sea público si las extensiones se compilan en una dll y se hará referencia en otro conjunto.

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow