Dot-Net

VB.NET:不可能在 System.Object 實例上使用擴展方法

  • July 12, 2010

我可以為System.Object(所有)的所有子類創建一個擴展方法嗎?

例子:

<Extension>
Public Function MyExtension(value As Object) As Object
   Return value
End Function

上述函式不適用於對象實例:

Dim myObj1 As New Object()
Dim myObj2 = myObj1.MyExtension()

編譯器不接受,是我電腦的問題嗎?:)

更新問題似乎只發生在VB中,其中對象的成員通過反射(後期綁定
) 查找。

回答後更新

僅供參考,因為 vb 具有 C# 缺乏的優勢,即導入模組的成員被導入到全域範圍,因此您仍然可以在沒有包裝器的情況下使用此函式:

Dim myObj2 = MyExtension(myObj1)

您不能直接為 Object 編寫擴展方法,但使用泛型可以達到相同的結果:

<Extension()>
Public Function NullSafeToString(Of T)(this As T) As String
   If this is Nothing Then
      Return String.Empty
   End If
   Return this.ToString()
End Function

請注意,除了聲明為 Object 類型的事物之外,您可以將其作為擴展方法呼叫。對於那些,您必須直接呼叫它(完整證明)或通過強制轉換呼叫(這可能會失敗,因為沒有通用介面,所以有點機會)。

似乎不支持 Object 的擴展方法是 VB 中的設計決定。

因此,我們可以防止擴展方法完全破壞現有的後期綁定程式碼的唯一方法是防止它們被用於任何類型為對象的東西。

<http://blogs.msdn.com/b/vbteam/archive/2007/01/24/extension-methods-and-late-binding-extension-methods-part-4.aspx>

引用自:https://stackoverflow.com/questions/3227888