我为所有基类型以及通用数组创建了一个MyFunc扩展(在Module Extensions中),ICollection(Of T)和Dictionary(Of String,T):
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
在大多数情况下,我直接使用这些函数(即“Test”.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 :(得分:1)
首先,如果不循环遍历所有方法并选择所需方法,则无法获得泛型方法。看到这个问题:
Get a generic method without using GetMethods
接下来,如果不放置所有通用参数,则无法创建和调用泛型方法。您必须使LateBoundMyFunc
成为通用方法,或以某种方式更改它以接受T
Dictionary(Of String, T)
类型的值。选择方法后,您必须在其上调用CreateGenericMethod
来放置这些参数。这就是反射的工作原理。你必须做所有的工作,它无法为你找出类型。
最后一个问题是任何Dictionary(Of String, T)
也都是ICollection
。所以你需要交换那些支票的顺序。