Delegate.CreateDelegate против DynamicMethod против выражения - PullRequest
23 голосов
/ 28 февраля 2009

Вопросы о Размышление и изучение делегатов ...

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

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

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

Ответы [ 2 ]

23 голосов
/ 28 февраля 2009

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

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

Это помогает?

5 голосов
/ 01 марта 2009

Через блог Ayende, я получил эту интересную ссылку, которая показывает, что вы можете делать с помощью динамических методов. В качестве примера это вполне понятно:
Ускорение основанных на Enum словарей с помощью Generic EnumComparer

Обновление

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

...