2010-12-13 47 views
0
var leftCurrent = leftArray.GetValue(i); 
var rightCurrent = rightArray.GetValue(i); 

var mi = typeof (PropertyCompare).GetMethod("NotEqualProperties"); 
mi.MakeGenericMethod(leftCurrent.GetType()); 

var notEqualProps = mi.Invoke(null,new []{leftCurrent, rightCurrent}); 

if(notEqualProps != null) 
    result.Add(new ArraysDiffResult(i, notEqualProps as List<string>)); 

爲什麼此代碼會拋出InvalidOperationException(對於ContainsGenericParameters爲true的類型或方法,無法對後期操作執行操作)?構建通用方法的C#

NotEqualProperties是靜態泛型方法..

UPD:我已經找到解決方案。忘了分配新的MethodInfo ...(Epic Fail ..)

但是性能如何?

回答

1

MakeGenericMethod返回一個新的MethodInfo實例。 (MethodInfo是不可變的)

您的代碼創建此新實例,將其拋出,然後繼續使用打開(非參數化)MethodInfo

您需要使用新的實例,就像這樣:

mi = mi.MakeGenericMethod(leftCurrent.GetType()); 

是;反射比正常的方法調用慢得多。
但是,除非您在緊密循環中調用它,否則不一定是問題。

1

你沒有指定的

mi.MakeGenericMethod(leftCurrent.GetType()); 

到任何結果。請注意,MakeGenericMethod不會改變調用實例。

P.S此代碼是否比直接調用方法慢(無mi.Invoke)?

很多?我不知道。要知道的唯一方法是設置性能基準和配置文件。

+0

請你分享一些鏈接到VS探查器的評論/教程/樣本? – 2010-12-13 16:44:37

+0

@ taras.roshko:http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=nant+profiler+tutorial#sclient=psy&hl=zh-CN&q=ants+profiler+tutorial+review&aq=f&aqi=&aql= &oq =&gs_rfai =&pbx = 1&fp = 1(我不想在這裏變成一個混蛋,我只是不知道任何具體的評論/教程/樣例是否好,我可以告訴你,ANTS非常易於使用。 ) – jason 2010-12-13 16:46:52

1

哦,我傻......它應該是:

mi = mi.MakeGenericMethod(leftCurrent.GetType()); 

(捂臉......)。 但是性能如何?