Поиск…


замечания

Методы расширения - это методы ( Sub или Function ), которые добавляют функциональность к типу (который может быть ссылочным типом или типом значения). Эти типы могут принадлежать вам или нет.

Они могут быть или не быть в той же сборке, что и тип, который они должны изменить. Вы можете разрешить доступ к вашим методам расширения, изолируя их в своем собственном пространстве имен. Или, если вы предпочитаете, вы можете сделать их всегда доступными, включив их в том же пространстве имен, что и тип, который они изменяют (при условии, что все ссылки на сборку установлены и правильны). См. Проект Entity Framework Core 1.0 на GitHub для хорошего примера стиля вставки методов расширения.

Методы расширения в VB имеют несколько требований:

  • Методы расширения могут быть объявлены только в модулях.
  • Методы расширения должны быть украшены атрибутом Extension() .
  • Пространство имен ExtensionAttribute должно быть доступно в вашем модуле.
    Imports System.Runtime.CompilerServices
  • Первый параметр метода должен быть типа, к которому этот метод будет привязан.
  • Первый параметр метода будет представлять экземпляр, в котором работает этот метод. (Эквивалентно Me если это был метод реального экземпляра).
  • Метод расширения можно вызывать как обычный метод, предоставляя все параметры, если они не вызываются на экземпляр объекта.

Создание метода расширения

Методы расширения полезны для расширения поведения библиотек, которые у нас нет.

Они используются аналогично методам экземпляров благодаря синтаксическому сахару компилятора:

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

Для использования метода расширения для использования метод требует атрибута Extension и должен быть объявлен в Module .

Создание языка более функциональным с помощью методов расширения

Хорошим использованием метода расширения является более функциональный язык

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

Числа нумерации

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

Получение версии сборки от сильного имени

Пример вызова метода расширения как расширения и как обычного метода.

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

Метод расширения в модуле. Сделайте модуль общедоступным, если расширения скомпилированы в dll и будут указаны в другой сборке.

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
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow