2012-05-14 1 views
3

비 인스턴스 유형이란 더 나은 용어가 부족하여 공용 생성자를 노출시키지 않는 유형을 의미합니다.확장을 사용하여 인스턴스가 아닌 유형의 공유 메서드를 어떻게 오버로드합니까?

나는 값 구분 기호를 나타내는 입력 Char의 매개 변수를 ToString()의 과부하로 BitConverter 클래스를 확장하고자합니다.

왜? 기본적으로 ToString() 호출은 대시 기호로 구분 된 바이트 배열의 문자열 표현을 반환합니다. 이 서명은 다른 구분 기호를 지정할 수 없도록하므로 매우 불행합니다.

이제 인스턴스 유형이 아니거나 공유 메서드가 오버로드되어 확장 메서드 정의를위한 적절한 구문을 찾는 데 어려움이 있습니다.

나는 오버로드가 인텔리에 표시되지 원인이 잘못 여기서 뭐하는 거지 :

Imports System.Runtime.CompilerServices 

Module BitConverterExtensions 
    <Extension()> 
    Public Function ToString(ByVal converter As BitConverter, ByVal value() As Byte, ByVal delimiter As Char) As String 
     Return BitConverterExtensions.ToString(converter, value, 0, value.Length, delimiter) 
    End Function 

    <Extension()> 
    Public Function ToString(ByVal converter As BitConverter, ByVal value() As Byte, ByVal startIndex As Integer, ByVal delimiter As Char) As String 
     Return BitConverterExtensions.ToString(converter, value, startIndex, value.Length, delimiter) 
    End Function 

    <Extension()> 
    Public Function ToString(ByVal converter As BitConverter, ByVal value() As Byte, ByVal startIndex As Integer, ByVal length As Integer, ByVal delimiter As Char) As String 
     Dim bytes As String = BitConverter.ToString(value, startIndex, length) 
     Return bytes.Replace("-"c, delimiter) 
    End Function 

End Module 

을 아니면 공유 방법을 확장하기 위해 단순히 불가능하다?

답변

3

shared/static 유형의 메소드 오버로드를 도입 할 수 없습니다. 확장 메서드는 형식 자체가 아닌 형식의 인스턴스에 의해 사용이 제어되는 기능입니다.

+0

흠 ... 그건 내가 생각했지만 주제에 대한 유용한 정보를 찾을 수 없었습니다. 명확히 해 주셔서 감사합니다. –

+0

올바른 방법은 이러한 확장 메서드를 일반 메서드로 변환 한 다음 직접 호출하는 것입니다. –

+0

@StevenDotNet 네, 이것이 최선의 방법입니다. 또 다른 방법은 자신의 메서드를 제공하고 기본 구현 메커니즘으로'BitConverter'를 사용하는 다른 유형을 만드는 것입니다. 그런 다음 해당 유형의 인스턴스를 사용자 정의 메서드로 전달하십시오. – JaredPar