簡體   English   中英

使用反射調用擴展方法

[英]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)?

首先,如果不遍歷所有方法並選擇所需的方法,就無法獲得通用方法。 看到這個問題:

在不使用GetMethods的情況下獲取通用方法

接下來,您必須創建所有通用參數,然后才能創建和調用通用方法。 您必須使LateBoundMyFunc為通用方法,或以某種方式對其進行更改以接受Dictionary(Of String, T)T類型的值。 一旦選擇了方法,就必須在其上調用CreateGenericMethod來容納這些參數。 這就是反射的工作方式。 您必須完成所有工作,並且無法為您確定類型。

最后一個問題是,任何Dictionary(Of String, T) 將是ICollection 因此,您需要交換這些檢查的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM