문제

나는 명시 적으로 대신 이름으로 대의원을 인스턴스화하고 호출 할 수 있는지 알아 내려고 노력하고 있습니다. 코드 벨로우가 상당히 잘 설명된다고 생각합니다 .... 함수 이름을 수락 한 다음이를 기반으로 대의원을 인스턴스화하고 싶습니다. 이 예에서는 선택된 사례를 사용하지만이를 제거하고 메소드 이름 인수 자체를 사용하고 싶습니다.

정중하게 ... 이것이 미쳤다고 말하고 싶은 충동을 피하고 나는 이것에 대해 완전히 다른 접근법을 취해야합니다. :)

    Private Delegate Sub myDelegate()  

    Private Sub myDelegate_Implementation1()
        'Some code
    End Sub
    Private Sub myDelegate_Implementation2()
        'Some code
    End Sub

    Public Sub InvokeMethod(ByVal methodName As String)
        Dim func As myDelegate = Nothing
        '??? HOW TO GET RID OF THIS SELECT CASE BLOCK?:
        Select Case methodName
            Case "myDelegate_Implementation1"
                func = AddressOf myDelegate_Implementation1
            Case "myDelegate_Implementation2"
                func = AddressOf myDelegate_Implementation2
        End Select
        func.Invoke()
    End Sub

감사합니다 Keith, 정확히 내가 찾고 있던 것. (Bfree의 접근 방식은 대부분의 상황에서도 효과가있을 것입니다).

VB의 작동 코드는 다음과 같습니다.

Public Delegate Sub xxxDelegate()

Sub xxxAnImplementation()

End Sub

Sub zzzDoIt(ByVal xxxImplementerName As String)
    Dim theDelegate As xxxDelegate = CType(System.Delegate.CreateDelegate(GetType(xxxDelegate), Me, xxxImplementerName), xxxDelegate)
    theDelegate.Invoke()
End Sub

Private Sub LoadFunctions()
    Dim thisClass As Type = Type.GetType(Me.GetType.BaseType.FullName.ToString)
    For Each method As MethodInfo In thisClass.GetMethods(System.Reflection.BindingFlags.DeclaredOnly)
        If 1 = 1 OrElse method.Name.Substring(0, 3) = "Get" Then
            Me.ddlCodeSamples.Items.Add(method.Name)
        End If
    Next
End Sub
도움이 되었습니까?

해결책

방법에 대한 대의원이있는 경우 다음을 수행 할 수도 있습니다.

public delegate void MethodDelegate( ... ) ...

//create the delegate we expect
(MethodDelegate) Delegate.CreateDelegate(
    typeof( MethodDelegate ), this, "methodName", true );

C#은 알고 있지만 비슷한 것은 VB에서 작동합니다.

일반적으로 @bfree의 답변과 함께 갈 것입니다. 그러나 이것은 이벤트 중심 반사로 작업 할 때 잘 작동합니다. 결과를 호출하면 많은 시간을 호출하면 이것이 약간 더 빨라질 것이라고 생각합니다.

다른 팁

당신이 요구하는 것이 가능한지 확실하지 않기 때문에 질문에 완전히 대답하지 않을 것입니다. 그러나 반사를 통해 가능한 것은 메소드 이름이 주어지면 메소드를 호출하는 것입니다. 즉:

    string methodName = "MyMethod";
    MethodInfo method = this.GetType().GetMethod(methodName);
    method.Invoke(this, null);

Select 문 대신 hashtable을 사용하지 않는 이유는 무엇입니까?

Bfree의 대답 공장;

내 대답은 단지 제안 일뿐입니다.

문자열에서 메소드 이름을 전달하는 대신 메소드 주소를 호출했던 방법으로 전달하지 않겠습니까?

Module Module1
Sub Main()
    InvokeMethod(AddressOf myDelegate_Implementation1)
    InvokeMethod(AddressOf myDelegate_Implementation2)
End Sub

Public Delegate Sub myDelegate()

Private Sub myDelegate_Implementation1()
    Console.WriteLine("myDelegate_Implementation1")
End Sub
Private Sub myDelegate_Implementation2()
    Console.WriteLine("myDelegate_Implementation2")
End Sub

Public Sub InvokeMethod(ByVal func As myDelegate)
    func()
End Sub
End Module
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top