设置表达式<func <t>&gt;的值在一个函数内部

时间:2017-09-12 09:07:23

标签: c# reflection lambda expression

以下是我撰写的完整论证验证系统的一部分,该系统验证了用户给出的参数:

public void Validate<T>(Expression<Func<T>> argExpr, bool justClean) where T : IComparable, IComparable<T>, IConvertible, IEquatable<T>
{
    var expressionBody = (MemberExpression)argExpr.Body;
    var argName = expressionBody.Member.Name;
    var value = argExpr.Compile().Invoke();
    if(!justClean)
        //check above value against invalid values and throw exception
    else
        //clean the value and MY QUESTION: set member's value
}

现在我们需要将表达式的成员值设置为给定值的清理版本,如下所示:

Validate(() => item.ItemName, true);

因此,我希望item.ItemName具有在Validate方法中设置的清理值。

请注意,由于我的代码流,我们不能简单地将该值作为函数结果返回。 那么,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:1)

您可以根据发送到函数的表达式生成一个setter表达式:

public static void Validate<T>(Expression<Func<T>> argExpr, bool justClean) where T : IComparable, IComparable<T>, IConvertible, IEquatable<T>
{
    var expressionBody = (MemberExpression)argExpr.Body;
    var argName = expressionBody.Member.Name;
    var value = argExpr.Compile().Invoke();
    if (!justClean)
    {
    }
    else
    {
        var param = Expression.Parameter(typeof(T));
        var setter = Expression.Lambda<Action<T>>(
            Expression.Assign(
                expressionBody,
                param
            ),
            param
        ).Compile();
        setter(default(T)); // Used default(T) as an example, can be any other T value 
    }
}