2011-06-01 71 views
33

我有一個問題。是否有可能在.NET中使用反射調用泛型方法? 我嘗試下面的代碼在.NET中調用使用反射的泛型方法

var service = new ServiceClass(); 
Type serviceType = service.GetType(); 
MethodInfo method = serviceType.GetMethod("Method1", new Type[]{}); 
method.MakeGenericMethod(typeof(SomeClass)); 
var result = method.Invoke(service, null); 

但它拋出了以下異常「晚綁定操作不能在類型或採用何種方法ContainsGenericParameters是真正的執行。」

回答

86

你不使用MakeGenericMethod的結果 - 它不會改變你調用它的方法;它返回表示構造方法的另一個對象。你應該有這樣的東西:

method = method.MakeGenericMethod(typeof(SomeClass)); 
var result = method.Invoke(service, null); 

(或使用不同的變量,當然)。

+0

太棒了!它現在有效。我相當愚蠢的錯... – yshchohaleu 2011-06-01 16:33:07

+0

我有同樣的確切問題沒有意識到'MakeGenericMethod'是一個函數,而不是一個無效的方法,我敢肯定它也是ha_t的問題。 – Shimmy 2011-11-21 10:29:43

+0

我只是犯了同樣的錯誤,但是這是因爲我插入了行來分配MakeGenericMethod的結果,但忘記更改調用代碼以使用新的返回值。 – Charlie 2012-09-04 21:33:39

2

你需要說

method = method.MakeGenericMethod(typeof(SomeClass)); 

在的最小和最好

var constructedMethod = method.MakeGenericMethod(typeof(SomeClass)); 
constructedMethod.Invoke(service, null); 

MethodInfo實例是不可變的。

這是相同的概念

string s = "Foo "; 
s.Trim(); 
Console.WriteLine(s.Length); 
string t = s.Trim(); 
Console.WriteLine(t.Length); 

造成

4 
3 

打印在控制檯上。

順便說一句,你的錯誤消息

「操作不能在類型或採用何種方法ContainsGenericParameterstrue進行後期綁定。」

如果你的線索method仍然包含泛型參數。