수색…


비고

확장 메서드는 Type (참조 형식 또는 값 형식 일 수 있음)에 기능을 추가하는 메서드 ( 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