使用反射调用扩展方法

时间:2011-11-16 04:29:56

标签: .net vb.net

我为所有基类型以及通用数组创建了一个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)?

1 个答案:

答案 0 :(得分:1)

首先,如果不循环遍历所有方法并选择所需方法,则无法获得泛型方法。看到这个问题:

Get a generic method without using GetMethods

接下来,如果不放置所有通用参数,则无法创建和调用泛型方法。您必须使LateBoundMyFunc成为通用方法,或以某种方式更改它以接受T Dictionary(Of String, T)类型的值。选择方法后,您必须在其上调用CreateGenericMethod来放置这些参数。这就是反射的工作原理。你必须做所有的工作,它无法为你找出类型。

最后一个问题是任何Dictionary(Of String, T) 都是ICollection。所以你需要交换那些支票的顺序。