programing

VB.NET: 시스템에서 확장 메서드를 사용할 수 없습니다.객체 인스턴스

oldcodes 2023. 5. 14. 11:03
반응형

VB.NET: 시스템에서 확장 메서드를 사용할 수 없습니다.객체 인스턴스

의 모든 하위 클래스에 대해 확장 메서드를 만들 수 있습니까?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에서는 반사(늦은 경계)에 의해 객체의 멤버가 조회됩니다.

응답 후 업데이트
참고로, vb는 C#에 없는 장점이 있기 때문에 가져온 모듈의 구성원을 글로벌 범위로 가져오므로 래퍼 없이도 이 기능을 계속 사용할 수 있습니다.

Dim myObj2 = MyExtension(myObj1)

객체에 대한 확장 메서드를 지원하지 않는 것은 VB의 설계 결정이었던 것 같습니다.

결과적으로 확장 메서드가 기존의 late bound 코드를 완전히 깨지는 것을 방지할 수 있는 유일한 방법은 객체로 입력된 모든 항목에서 사용되지 않도록 하는 것이었습니다.

링크

제가 얼마 전에 질문한 이 질문을 보세요.기본적으로 확장할 수 있습니다. 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()

확장 방법이 작동하지 않는 이유를 자문해 보십시오.dynamic변수는 C#으로 표시되며, 설명이 동일하다는 것을 알게 될 것입니다.

개체에 대한 확장 메서드를 직접 작성할 수는 없지만 제네릭을 사용하면 다음과 같은 결과를 얻을 수 있습니다.

<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

개체 유형으로 선언된 항목을 제외한 모든 항목에 대해 확장 메서드로 호출할 수 있습니다.이러한 경우 직접(완전한 증거) 또는 주조를 통해 호출해야 합니다(유니버설 인터페이스가 없기 때문에 다소 가능성이 있기 때문에 실패할 수 있음).

jmoreno의 답변을 사용할 수 없습니다. 오류가 발생합니다.

BC30512 옵션 엄격 적용은 '개체'에서 '정수'로 암묵적으로 전환하는 것을 허용하지 않습니다.

클래스에서 확장 모듈로 컨텍스트 전환이 필요합니다.

Dim text1 As String = MyExtModule.NullSafeToString(DataGridView1.Rows(0).Cells(0).Value)

물론 할 수 있지만, 모든 물체를 어지럽히지 않기 위해 여기서 하는 일에 신경을 쓰고 싶을 수도 있습니다.내가 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

편집 -

해설자를 돕기 위해 아래에 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

개체 인텔리전스에 대해 너무 많은 확장을 수행하면 유용성이 떨어질 수 있지만 완전히 유효합니다.

다음은 개체 정보에 대한 개체 확장 방법의 예입니다.

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

언급URL : https://stackoverflow.com/questions/3227888/vb-net-impossible-to-use-extension-method-on-system-object-instance

반응형