[英]Using Reflection to Invoke an Extension Method
我為所有基本類型以及通用數組ICollection(T)和Dictionary(Of String,T)創建了MyFunc擴展(在Module Extensions中):
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)?
首先,如果不遍歷所有方法並選擇所需的方法,就無法獲得通用方法。 看到這個問題:
接下來,您必須創建所有通用參數,然后才能創建和調用通用方法。 您必須使LateBoundMyFunc
為通用方法,或以某種方式對其進行更改以接受Dictionary(Of String, T)
的T
類型的值。 一旦選擇了方法,就必須在其上調用CreateGenericMethod
來容納這些參數。 這就是反射的工作方式。 您必須完成所有工作,並且無法為您確定類型。
最后一個問題是,任何Dictionary(Of String, T)
也將是ICollection
。 因此,您需要交換這些檢查的順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.