サーチ…


備考

拡張メソッドは、型(参照型または値型でもよい)に機能を追加するメソッド( 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