Visual Basic .NET Language
Методы расширения
Поиск…
замечания
Методы расширения - это методы ( 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