2011-11-16 3 views
2

모든 기본 형식과 ICollection (Of T) 및 Dictionary (Of String, T)에 대한 MyFunc 확장을 Module Extensions에 만들었습니다.Reflection을 사용하여 확장 메서드 호출

Function MyFunc(Of T)(a() As T) As String 
Function MyFunc(Of T)(collection As ICollection(Of T)) As String 
Function MyFunc(Of T)(dict As Dictionary(Of String,T)) As String 

대부분의 경우, 내가 직접 함수를 사용 (즉, "테스트".MyFunc())하지만 일반적인 기능에 일하고있는 런타임에 바인딩 된 경우가있다는 :

Function LateBoundMyFunc(val As Object) As String 
    Dim t As Type = val.GetType 
    If TypeOf val Is Array Then 
    t = ???? 
    ElseIf TypeOf val Is ICollection 
    t = ???? 
    ElseIf Typeof val Is Dictionary(Of String,) <- This fails 
    t = ???? 
    End If 
    Return CType(GetType(Extensions).GetMethod("MyFunc",New Type(){t}).Invoke(Nothing,New Object(){val}),String) 

그것은 상당히입니다 기본 유형을 처리하기는 쉽지만, 대신 ???? 어떻게 Dictionary (Of String, T)를 테스트합니까?

+0

"val이'T가 알려져 있지 않은'Dictionary (Of String, T) '유형인지 어떻게 확인합니까?" 아니면'T'가 어떤 타입인지 알아? –

+0

@Pranay 아니요 ... New Type() {t}은 generic 함수 각각에 대해 저장된 형식과 일치해야합니다. GetMethod에 대한 조회로 작동합니다. – ic3b3rg

+0

@Merlyn T는 모든 유형이 될 수 있습니다. – ic3b3rg

답변

1

먼저 모든 메서드를 반복하고 원하는 메서드를 선택하지 않고 일반 메서드를 가져올 수 없습니다. 이 질문을 참조하십시오 :

Get a generic method without using GetMethods

다음을 작성하고 모든 일반 매개 변수를 좌석없이 제네릭 메서드를 호출 할 수 없습니다. LateBoundMyFunc을 제네릭 방식으로 만들거나 T 유형의 값을 Dictionary(Of String, T)에 적용하도록 변경해야합니다. 이 방법을 선택한 후에는 CreateGenericMethod에 전화하여 해당 매개 변수를 고정시켜야합니다. 이것은 반사가 작동하는 방법입니다. 당신은 모든 일을해야하며, 당신을위한 유형을 알아낼 수 없습니다.

마지막 문제는 Dictionary(Of String, T)일 수도 있고ICollection 일 것입니다. 따라서 수표의 순서를 바꿔야합니다.

관련 문제