c# - 在函数内设置 Expression<Func<T>> 的值

标签 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 方法中设置的清理值。

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

最佳答案

您可以根据发送到函数的表达式生成一个 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 
    }
}

关于c# - 在函数内设置 Expression<Func<T>> 的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46172281/

相关文章:

c# - 使用 AJAX 从列表返回属性

c# - 如何打开实际上已关闭的 Wifi 适配器的 radio ?

c# - 在 C# 中使用反射创建具有字符串值的未知枚举实例

c# - 在不知道泛型类型的情况下将对象添加到集合中

javascript - 在 AWS 上使用 mysql-npm 运行 mysql 查询

c# - 具有通用类型 T 的 SetValue

C# 如何从基类中的派生类获取特定类型的所有字段?

java - 如何在方法中获取参数值的完全限定名称

c++ - 处理作用域变量的内部函数

c# - for 循环和带闭包的 foreach 循环的不同行为