Delegat.CreateDelegate vs DynamicMethod vs Expression

Pytania o wywołanie refleksji i poznanie delegatów ...

Jeśli muszę utworzyć delegaty Func<T, TResult> do metod na dynamicznie ładowanych typach, mogę potencjalnie użyć (1) Delegate.CreateDelegate (2) DynamicMethod (3) Expression drzewa.

Powiedzmy, że zestaw dynamicznie ładowanych typów / metod jest odzwierciedlany podczas uruchamiania aplikacji przez config i używany przez cały okres życia aplikacji( wydajność uruchamiania nie jest problemem, podobnie jak pamięć), delegaty są buforowane i wysyłane do w sposób mocno zakodowany. Te delegaty są dostępnymi jednocześnie gorącymi ścieżkami.

Jaką metodę dynamicznego wiązania wolisz i dlaczego?

Author: jsw, 2009-02-28

2 answers

Jeśli są rzeczywiście istniejącymi metodami, do których masz MethodInfo i mają odpowiednie sygnatury, to powiedziałbym Delegate.CreateDelegate jest właściwą drogą - robi dokładnie to, co chcesz, bez zamieszania. Użyłbym DynamicMethod lub drzew wyrażeń, gdybym potrzebował zbudować delegata do wykonania logiki, która nie została jeszcze uchwycona w metodzie.

Drzewa wyrażeń są (IMO, a ja nie używałem DynamicMethod w gniewie) nieco łatwiejsze w użyciu niż DynamicMethod, ale są bardziej ograniczone - w zasadzie mogą tylko reprezentują pojedyncze wyrażenie (które oczywiście może wywołać inną metodę). DynamicMethod daje Ci dużą elastyczność, ale musisz dobrze zrozumieć IL.

Czy to pomaga?
 21
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-02-28 14:20:51

Na blogu Ayende dostałem ciekawy link, który pokazuje, jakie rzeczy można robić metodami dynamicznymi. Jako przykład jest całkiem zrozumiały:
przyspieszanie słowników opartych na Enum z ogólnym EnumComparer

Update

Należy zauważyć, że w świecie WinRT, Reflection.Emit jest niedostępny - niektóre informacje można znaleźć tutaj

 5
Author: flq,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-04-03 07:14:12