Delegate.CreateDelegate vs DynamicMethod vs Expression
Вопросы о Выполнение размышлений и поиск делегатов...
Если мне нужно создать делегаты Func<T, TResult>
для методов динамически загружаемых типов, я мог бы потенциально использовать (1) Delegate.CreateDelegate
(2) DynamicMethod
(3) Expression
деревья.
Допустим, что набор динамически загружаемых типов/методов отражается один раз при запуске приложения через конфигурацию и используется на протяжении всего жизненного цикла приложения (начальная производительность не является проблемой, и ни одна из них не является памятью), делегаты кэшируются и отправляются в строго типизированном виде. Этими делегатами являются доступ к горячим путям одновременно.
Какой метод динамической привязки вы бы предпочли и почему?
Ответы
Ответ 1
Если они на самом деле существующие методы, для которых у вас есть MethodInfo
for, и у них есть правильные подписи, тогда я бы сказал, что Delegate.CreateDelegate
- правильный путь - он делает именно то, что вы хотите, без возня. Я бы использовал DynamicMethod
или деревья выражений, если мне нужно было создать делегат для выполнения некоторой логики, которая еще не была захвачена в методе.
Деревья выражений (IMO, и я не использовал DynamicMethod
в гневе) несколько проще в использовании, чем DynamicMethod
, но они более ограничены - в основном они могут представлять только одно выражение (которое может вызвать другое метод, конечно). DynamicMethod
дает вам большую гибкость, но вам нужно понимать IL достаточно хорошо.
Помогает ли это?
Ответ 2
Блог Via Ayende У меня есть эта интересная ссылка, которая показывает то, что вы можете сделать с помощью Dynamic Methods. В качестве примера это вполне понятно:
Ускоряющие словари на основе энтузиастов с общим EnumComparer
Обновление
Следует отметить, что в мире WinRT Reflection.Emit
недоступен - некоторая информация может быть найдена здесь