ParameterExpression转换为使用反射进行对象转换

时间:2015-03-31 08:36:13

标签: c# reflection

我想从ParameterExpression类中转换任何对象。

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

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。

1 个答案:

答案 0 :(得分:1)

这是......通过此,您应该能够提取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;
}