Подтвердить что ты не робот

Delegate.CreateDelegate vs DynamicMethod vs Expression

Вопросы о Выполнение размышлений и поиск делегатов...

Если мне нужно создать делегаты Func<T, TResult> для методов динамически загружаемых типов, я мог бы потенциально использовать (1) Delegate.CreateDelegate (2) DynamicMethod (3) Expression деревья.

Допустим, что набор динамически загружаемых типов/методов отражается один раз при запуске приложения через конфигурацию и используется на протяжении всего жизненного цикла приложения (начальная производительность не является проблемой, и ни одна из них не является памятью), делегаты кэшируются и отправляются в строго типизированном виде. Этими делегатами являются доступ к горячим путям одновременно.

Какой метод динамической привязки вы бы предпочли и почему?

4b9b3361

Ответ 1

Если они на самом деле существующие методы, для которых у вас есть MethodInfo for, и у них есть правильные подписи, тогда я бы сказал, что Delegate.CreateDelegate - правильный путь - он делает именно то, что вы хотите, без возня. Я бы использовал DynamicMethod или деревья выражений, если мне нужно было создать делегат для выполнения некоторой логики, которая еще не была захвачена в методе.

Деревья выражений (IMO, и я не использовал DynamicMethod в гневе) несколько проще в использовании, чем DynamicMethod, но они более ограничены - в основном они могут представлять только одно выражение (которое может вызвать другое метод, конечно). DynamicMethod дает вам большую гибкость, но вам нужно понимать IL достаточно хорошо.

Помогает ли это?

Ответ 2

Блог Via Ayende У меня есть эта интересная ссылка, которая показывает то, что вы можете сделать с помощью Dynamic Methods. В качестве примера это вполне понятно:
Ускоряющие словари на основе энтузиастов с общим EnumComparer

Обновление

Следует отметить, что в мире WinRT Reflection.Emit недоступен - некоторая информация может быть найдена здесь