2010-12-13 63 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>)); 

Pourquoi ce code lance-t-il InvalidOperationException (Les opérations liées tardivement ne peuvent pas être effectuées sur les types ou les méthodes pour lesquels ContainsGenericParameters est vrai.)?C# construction de la méthode générique

NotEqualProperties est méthode générique statique ..

UPD: Je l'ai déjà trouvé la solution. Juste oublié d'assigner de nouvelles MethodInfo ... (Epic Fail ..)

Mais que diriez-vous de la performance?

Répondre

1

MakeGenericMethod renvoie une nouvelle instance MethodInfo. (MethodInfo est immuable)

Votre code crée cette nouvelle instance, la rejette, puis continue à utiliser le code ouvert (non paramétré) MethodInfo.

Vous devez utiliser la nouvelle instance, comme ceci:

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

Oui; la réflexion est beaucoup plus lente que les appels de méthode normaux.
Cependant, à moins que vous ne l'appeliez dans une boucle serrée, ce n'est pas nécessairement un problème.

1

Vous n'avez pas affecté le résultat de

mi.MakeGenericMethod(leftCurrent.GetType()); 

à quoi que ce soit. Notez que MakeGenericMethod ne mute pas l'instance invoquante.

P.S Ce code est-il beaucoup plus lent que la méthode d'appel directement (sans mi.Invoke)?

Beaucoup? Je ne sais pas. La seule façon de savoir est de définir des benchmarks de performance et de profiler.

+0

Pourriez-vous s'il vous plaît partager des liens vers des critiques/tutoriels/échantillons VS profiler? –

+0

@ taras.roshko: http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=nant+profiler+tutorial#sclient=psy&hl=fr&q=ants+profiler+tutorial+review&aq=f&aqi=&aql= & oq = & gs_rfai = & pbx = 1 & fp = 1 (Je n'essaie pas d'être un abruti ici, je ne connais pas de critiques/tutoriels/échantillons qui soient bons, je peux vous dire que ANTS est très facile à utiliser.) – jason

1

Oh, je suis stupide ... Il devrait être:

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

(Facepalm ...). Mais qu'en est-il de la performance?