2010-08-31 55 views
1

在C#我想要創建一個通用的方法:C#通用方法+反射問題

  1. 接受一個MethodInfo對象作爲參數。
  2. 返回調用MethodInfo時返回的對象。

我混亂的根源是,我想的方法被統稱鍵入相同的返回類型爲MethodInfo對象是被傳入。

回答

2

你不能做到這一點。根據定義,泛型是編譯時構造,而特定的返回類型是隻在運行時才知道的(當您收到特定的MethodInfo實例時),並且會隨呼叫而改變。

+0

我不知道,如果只是說這不可能是公平的。例如,你可以創建一個包裝器MethodInfo ,它確保它返回類型T的一個對象,並且因此仍然受益於編譯時泛型(只要你的用例至少可以確保你在編譯時知道T)。 – 2013-03-22 20:57:20

+0

該問題要求該方法採用'MethodInfo'的實例,而不是其他類型的實例。這是有道理的,因爲'MethodInfo'是你從Reflection得到的。當然,如果你確實知道它將在編譯時返回的類型,你可以用一個轉換來包裝它,但是這首先打破了所有這些目標。 – 2013-03-25 21:06:52

+0

那麼,我在設想一個想要做這件事的場景時遇到了麻煩,並且在編譯時不知道返回類型 - 如果您不這樣做,那麼首先對泛型沒有任何好處。如果你這樣做,那麼在例如掃描程序集的用例中找到匹配特定格式(包括返回類型)的方法並將它們聚合爲MethodInfo對象,例如作爲模板庫的一部分。 – 2013-03-25 22:52:52

1

帕維爾Minaev是正確的,

我在這種情況下(當然我不知道整個上下文)的建議是使用返回動態類型,當然是不會被類型化的方法。

​​

或者因爲你知道什麼是返回類型,把在方法調用:

public T MyMethod<T>(MethodInfo methodInfo) 
當然,你的方法映射轉換內部麻煩談婚論嫁的

。 但你也可以使用lambda,就像放在一個參數轉換:

public T MyMethod<T>(MethodInfo methodInfo, Func<object, T> conversion) 

我認爲方法的調用會很清晰,如:

Console.WriteLine(MyMethod(methodInfo, (a) => Convert.ToString(a)));