gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 12:23:32 27 4
gpt4 key购买 nike

这是我编写的完整参数验证系统的一部分,它验证用户给定的参数:

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com