C # конструирование универсального метода - PullRequest
0 голосов
/ 13 декабря 2010
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.)?

NotEqualProperties - статический универсальный метод.

UPD: я уже нашел решение. Просто забыл назначить новый MethodInfo ... (Epic Fail ..)

А как насчет производительности?

Ответы [ 3 ]

1 голос
/ 13 декабря 2010

Вы не присвоили результат

mi.MakeGenericMethod(leftCurrent.GetType());

чему-либо.Обратите внимание, что MakeGenericMethod не изменяет вызывающий экземпляр.

PS Этот код намного медленнее, чем прямой вызов метода (без mi.Invoke)?

Многое?Я не знаю.Единственный способ узнать это - установить критерии производительности и профилировать.

1 голос
/ 13 декабря 2010

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

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

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

1 голос
/ 13 декабря 2010

MakeGenericMethod возвращает новый экземпляр MethodInfo.(MethodInfo является неизменным)

Ваш код создает этот новый экземпляр, выбрасывает его, затем продолжает использовать open (без параметризации) MethodInfo.

Вам необходимо использовать новыйнапример, вот так:

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

Да;отражение намного медленнее, чем обычные вызовы методов.
Однако, если вы не вызываете его в узком цикле, это не обязательно проблема.

...