Tengo una expresión de llamada de método e intento invocar el método. Descubrí una manera, pero tengo problemas para recuperar los valores de los parámetros, ya que no todos los argumentos se describen con ConstantExpression.Cómo llamar al método desde MethodCallExpression en C#
Expression<Action<T>> = t => t.DoSomething(Par0, Par1, Par2);
MethodCallExpression methodCallExpression = selector.Body
as MethodCallExpression;
// get the information which is needed to invoke the method from the provided
// lambda expression.
MethodInfo methodInfo = methodCallExpression.Method;
object[] arguments = methodCallExpression.Arguments.OfType<ConstantExpression>()
.Select(p => p.Value).ToArray();
// invoke the expression on every item within the enumerable
foreach (TSource item in source)
{
methodInfo.Invoke(item, arguments);
}
Además, he visto algunas otras maneras de invocar el método, ahora no estoy seguro de cuál es la forma correcta de hacerlo.
var func = expression.Compile();
var success = func.Invoke();
Así que mi pregunta es, ¿Cómo puedo recuperar los valores de los argumentos método de methodCallExpression.Arguments
?
¿O hay una manera más fácil de lograr mi objetivo?
Gracias, eso es mucho más fácil. Lo estoy haciendo así ahora: // compilamos la expresión lambda para obtener el delegado para invocar. Acción action = selector.Compile(); // invocar la expresión en cada elemento dentro de la enumerable foreach (elemento de fuente de origen) { acción (elemento); } Y, finalmente, también encontré la documentación de msdn para este problema: http://msdn.microsoft.com/en-us/library/bb882536.aspx –
Enyra
¿Hay alguna razón por la que no puedas hacer 'selector.Compile()() '? ¿Por qué 'Invoke' o' DynamicInvoke' cuando funcionan los paréntesis? – ErikE