I have a method call expression and try to invoke the method. I figured out a way, but I have problems in retrieving the parameter values since not every argument is described with a ConstantExpression.
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); }
Additionally, I have seen some other ways to invoke the method, now I’m not sure what is the right way to do it.
var func = expression.Compile(); var success = func.Invoke();
So my question is, how can I retrieve the method argument values from methodCallExpression.Arguments?
Or is there an easier way to achieve my goal?
You don’t need to worry about retrieving the arguments and calling the MethodInfo yourself, you can let .NET do it for you. All you need to do is create a Lambda expression containing that method.
eg.
That’s how I deal with nested queries in my Linq provider anyway.
EDIT: Actually, it looks like you might already have a LambdaExpression in the selector variable. In that case, you should be able to just compile and invoke it directly: