2010-12-13 21 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を割り当てるのを忘れました...(エピック・フェイル..

パフォーマンスはどうですか?

答えて

1

MakeGenericMethod新しいMethodInfoインスタンスを返します。 (MethodInfoは不変です)

コードは、この新しいインスタンスを作成し、それをスローし、オープン(パラメータ化されていない)MethodInfoを使用して続けます。あなたはこのように、新しいインスタンスを使用する必要が

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

はい。反射は通常のメソッド呼び出しよりもはるかに遅いです。
ただし、タイトなループで呼び出さない限り、必ずしも問題ではありません。

1

あなたは何にも

mi.MakeGenericMethod(leftCurrent.GetType()); 

の結果を代入しませんでした。 MakeGenericMethodは呼び出し元のインスタンスを変更しないことに注意してください。

P.Sこのコードは直接メソッドを呼び出すよりもはるかに低速ですか(mi.Invokeを除く)?

多分?知りません。知る唯一の方法は、パフォーマンスのベンチマークを設定し、プロファイルすることです。

+0

あなたはVSプロファイラのレビュー/チュートリアル/サンプルへのリンクを教えてください。 –

+0

@ taras.roshko:http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=nant+profiler+tutorial#sclient=psy&hl=en&q=ants+profiler+tutorial+review&aq=f&aqi=&aql= &oq =&gs_rfai =&pbx = 1&fp = 1(私はここでうんざりしているわけではないので、特定のレビュー/チュートリアル/サンプルはよくわかりませんが、ANTSはとても使いやすいと言うことができます。 ) – jason

1

ああ、私は愚かだ...それは次のようになります。

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

(手のひらを顔に当てます...)。 しかし、パフォーマンスについてはどうですか?

関連する問題