2010-12-13 3 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을 throw하는 이유는 무엇입니까? (ContainsGenericParameters가 true 인 형식이나 메서드에서는 런타임에 바인딩 된 작업을 수행 할 수 없습니다.)?C#으로 일반 메서드 생성

NotEqualProperties는

UPD .. 정적 일반적인 방법이다 : 나는 이미 해결책을 발견했습니다. 새로운 MethodInfo를 지정하는 것을 잊어 버렸습니다 ... (에픽 실패 ...)

성능은 어떻습니까?

답변

1

MakeGenericMethodMethodInfo 인스턴스를 반환합니다. (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()); 

(마른 세수 ...). 하지만 성능은 어떻습니까?