Я могу сделать Дополнительный метод для всех подклассов System.Object
(все)?
Пример:
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)
Если вы сделаете слишком много расширений для объектного интеллекта, это может стать менее полезным, но это совершенно верно.
Вот пример метода расширения объекта для информации об объекте:
http://www.developer.com/net/csharp/article.php/3718806/NET-Tip-Using-Extension-Methods.htm
См. этот вопрос, который я задавал некоторое время назад. В принципе, вы можете расширять Object
в VB.NET, если хотите; но по причинам обратной совместимости, никакая переменная объявленная как Object
не сможет использовать ваш метод расширения. Это происходит потому, что VB.NET поддерживает позднюю привязку Object
, поэтому попытка доступа к методу расширения будет проигнорирована в пользу попытки найти одноименный метод из типа рассматриваемого объекта.
Возьмем, к примеру, этот метод расширения:
<Extension()>
Public Sub Dump(ByVal obj As Object)
Console.WriteLine(obj)
End Sub
Этот метод расширения можно использовать здесь:
' Note: here we are calling the Dump extension method on a variable '
' typed as String, which works because String (like all classes) '
' inherits from Object. '
Dim str As String = "Hello!"
str.Dump()
Но не здесь:
' Here we attempt to call Dump on a variable typed as Object; but '
' this will not work since late binding is a feature that came before '
' extension methods. '
Dim obj As New Object
obj.Dump()
Спросите себя, почему методы расширения не работают с динамическими
переменными в C#, и вы поймете, что объяснение то же самое.
Конечно, вы можете, хотя, возможно, вы захотите быть осторожным в том, что вы здесь делаете, чтобы не загромождать каждый объект. Мне нравится использовать метод расширения для Object - это метод IsIn(), который функционирует аналогично SQL-оператору IN(). Приятно говорить такие вещи, как:
If someString.IsIn("a", "b", "c") Then
DoSomething()
Else If someInt.IsIn(1, 2, 3) Then
DoSomethingElse()
Else If someObj.IsIn(1, "q", #7/1/2010#) Then
DoSomethingTheThirdWay()
End If
EDIT -
Добавлена реализация метода расширения IsIn() ниже, чтобы помочь комментатору.
Imports System.Runtime.CompilerServices
Public Module ObjectExtensions
<Extension()>
Public Function IsIn(obj As Object, ParamArray values() As Object) As Boolean
For Each val As Object In values
If val.Equals(obj) Then Return True
Next
Return False
End Function
End Module
Похоже, что отказ от поддержки методов расширения на Object был проектным решением в VB.
В результате, единственный способ, которым мы можем предотвратить методы расширения от полностью сломать существующий поздний связанного кода, было предотвратить их использовать их на всем, что типизировано как объект.