VB.NET: невозможный использовать Дополнительный метод в Системе. Экземпляр объекта

Я могу сделать Дополнительный метод для всех подклассов 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)

36
задан Shimmy 13 July 2010 в 16:03
поделиться

4 ответа

Если вы сделаете слишком много расширений для объектного интеллекта, это может стать менее полезным, но это совершенно верно.

Вот пример метода расширения объекта для информации об объекте:

http://www.developer.com/net/csharp/article.php/3718806/NET-Tip-Using-Extension-Methods.htm

-4
ответ дан 27 November 2019 в 05:57
поделиться

См. этот вопрос, который я задавал некоторое время назад. В принципе, вы можете расширять 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#, и вы поймете, что объяснение то же самое.

13
ответ дан 27 November 2019 в 05:57
поделиться

Конечно, вы можете, хотя, возможно, вы захотите быть осторожным в том, что вы здесь делаете, чтобы не загромождать каждый объект. Мне нравится использовать метод расширения для 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
-1
ответ дан 27 November 2019 в 05:57
поделиться

Похоже, что отказ от поддержки методов расширения на Object был проектным решением в VB.

В результате, единственный способ, которым мы можем предотвратить методы расширения от полностью сломать существующий поздний связанного кода, было предотвратить их использовать их на всем, что типизировано как объект.

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

41
ответ дан 27 November 2019 в 05:57
поделиться
Другие вопросы по тегам:

Похожие вопросы: