Visual Basic .NET Language
拡張メソッド
サーチ…
備考
拡張メソッドは、型(参照型または値型でもよい)に機能を追加するメソッド( Sub
またはFunction
)です。これらのタイプはあなたが所有している場合と所有していない場合があります。
それらは、変更しようとしているタイプと同じアセンブリ内にある場合とそうでない場合があります。独自の名前空間で拡張メソッドを分離することで、拡張メソッドへのオプトインを許可することができます。あるいは、もしあなたが好むのであれば、それらが変更可能な型と同じ名前空間にそれらを含めることによってそれらを常に利用可能にすることができます(すべてのアセンブリ参照が適切であると仮定して)。拡張メソッドのオプトインスタイルの良い例については、GitHubのEntity Framework Core 1.0プロジェクトを参照してください。
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