使用反射将 ParameterExpression 转换为对象

ParameterExpression to Object Casting with Reflection

我想投射来自 ParameterExpression class 的任何对象。

这是示例代码(伪造我想说的):

public void Execute(Expression<Action<TService>> operation)
{
    try
    {

        var param = operation.Parameters[0]; //myparameter to cast
        var obj = param as AnyCastObject; // I want to cast
        DoSomething(obj); // and do something this object without losing any assigned propery.

        operation.Compile().Invoke(OpenNewChannel);
    }
    finally
    {
        CloseChannel();
    }
}

编辑:

这是我的方法体:

Execute(x => x.UserAuthentication(requestDto));

我想操作requestDto。

在这里...有了这个你应该能够提取你的requestDto

请注意,调用编译表达式时不需要 Invoke()

operation.Compile()(OpenNewChannel);

够了。

现在,提取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;
}