Here it is... With this you should be able to extract your requestDto.
Note that you don't need the Invoke() when you call compiled expressions.
operation.Compile()(OpenNewChannel);
is enough.
Now, to extract the requestDto:
// Works for Execute(x => x.UserAuthentication(something)) // where something must be a constant value, a variable, // a field, a property var param = operation.Parameters[0]; //myparameter to cast var body = operation.Body as MethodCallExpression; if (body == null || body.Object != param || body.Method.Name != "UserAuthentication") { throw new NotSupportedException(); } // If you have a type for the parameter, replace it here: // object -> yourtype object requestValue; var constantExpression = body.Arguments[0] as ConstantExpression; if (constantExpression == null) { // For nearly all the types of expression, the only way // to extract the final value is to compile them and then // execute them (the execution is the last "()" ) // If you have a type for the parameter, replace it here: // Func<object> -> Func<yourtype> requestValue = Expression.Lambda<Func<object>>(body.Arguments[0]).Compile()(); } else { // Constant expression values can be directly extracted // If you have a type for the parameter, replace it here: // (yourtype)constantExpression.Value requestValue = constantExpression.Value; }
paramisn't the "value" of the parameter, it is a "parameter" in the sense "the descriptor of the parameter". "casting" the "descriptor of the parameter" doesn't have any sense. What you can do is create a new expression tree where the "value" of the parameter is casted to something else and then something is done.ParameterExpressionfor a different type (MyServiceinstead ofTService)? Do you want to change the parameter type of the operation fromTServicetoMyService? Or what?operation.Compile(), do you want to compile theoperationthat was passed or do you want to compile anoperationthat you modified in some way?