2012-05-14 68 views
3

通過非實例類型我的意思是不公開公共構造函數,由於缺乏一個更好的詞的類型。如何使用擴展來重載非實例類型的共享方法?

我想擴展BitConverter類的過載ToString()需要一個Char類型的參數,表示一個值分隔符。

爲什麼?默認情況下,ToString()調用返回字符數組的字符串表示形式,由虛線符號分隔。簽名不允許你指定一個不同的分隔符,我覺得這很不幸。

現在,因爲這不是一個實例類型,或者也許是因爲我超載共享的方法,我有一個很難找到正確的語法來定義我的擴展方法。

我在做什麼錯在這裏,導致重載不顯示在IntelliSense起來:

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