2010-12-13 7 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 является истинным.)?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/учебники/образцы? –

+0

@ taras.roshko: http://www.google.com/search?sourceid=chrome&ie=UTF-8&q=nant+profiler+tutorial#sclient=psy&hl=ru&q=ants+profiler+tutorial+review&aq=f&aqi=&aql= & oq = & gs_rfai = & pbx = 1 & fp = 1 (я не пытаюсь быть рывком здесь, я просто не знаю никаких конкретных обзоров/учебников/образцов, которые хороши. Я могу сказать вам, что ANTS очень прост в использовании.) – jason

1

О, я глуп ... Он должен быть:

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

(Facepalm ...). Но как насчет производительности?

Смежные вопросы