MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как создать DynamicMethod из IL-кода?"
Answer 1006815
Прямая работа с Reflection.Emit обычно используется в особых случаях, когда нужно сгенерировать сложный многострочный метод. Для однострочного метода, который только вызывает другой метод, можно использовать более простое высокоуровневое средство - деревья выражений. При их использовании не нужно задумываться об отдельных инструкциях и корректности IL. Вот пример, также для более простого случая, когда метод call - статический:
using System; using System.Collections; using System.Linq.Expressions; using System.Reflection; namespace ConsoleApplication1 { class Program { public static object call(object[] args) { //... } static void Main(string[] args) { ParameterExpression param1 = Expression.Parameter(typeof(string), "v1"); ParameterExpression param2 = Expression.Parameter(typeof(int), "v2"); NewArrayExpression expr_arr = Expression.NewArrayInit( typeof(object), Expression.Convert(param1,typeof(object)), Expression.Convert(param2, typeof(object)) ); MethodCallExpression call_expr = Expression.Call(typeof(Program).GetMethod("call"), expr_arr); UnaryExpression conv_expr = Expression.Convert(call_expr, typeof(int)); var f_expr = Expression.Lambda<Func<string, int, int>>(conv_expr, param1,param2); Func<string, int, int> f = f_expr.Compile(); int res = f("test", 77); } } }
При этом деревья выражений внутри также используют Reflection.Emit и динамические методы. Тип времени выполнения метода f.Method будет
System.Reflection.Emit.DynamicMethod+RTDynamicMethod
, он также будет создан в специальной изолированной системной сборке и может быть выгружен сборщиком мусора, когда он больше не нужен.
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.