2011-11-16 40 views
2

我已經創建了一個MYFUNC延伸(在模塊擴展)對所有的基類型以及通用陣列,ICollection的(OF T)和詞典(串,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 

在大多數情況下,我直接使用功能(即「測試」 .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'是'Dictionary(Of String,T)'類型,其中T不知道?」或者你知道'T'應該是什麼類型? –

+0

@Pranay否它不會... New Type(){t}必須匹配每個通用函數的存儲類型 - 它用作GetMethod的查找 – ic3b3rg

+0

@Merlyn T可以是任何類型 – ic3b3rg

回答

1

首先,如果不循環所有方法並選擇所需的方法,就無法獲得泛型方法。看到這個問題:

Get a generic method without using GetMethods

接下來,你不能創建和調用泛型方法不休息都通用的參數。您必須使LateBoundMyFunc成爲通用方法,或者以某種方式修改它以接受TDictionary(Of String, T)類型的值。一旦你選擇了該方法,你就必須調用CreateGenericMethod來確定這些參數。這就是反射如何工作。你必須做所有的工作,並且它不能爲你找出類型。

最後一個問題是,任何Dictionary(Of String, T)ICollection。所以你需要交換這些檢查的順序。