提问人:Jawoy 提问时间:10/18/2023 最后编辑:Jawoy 更新时间:10/18/2023 访问量:87
向表达式添加 Linq 方法
Add a Linq method to an Expression
问:
我正在尝试制作一个通用方法,该方法采用表达式并向此表达式添加方法调用。 例如,我想添加.包含 或 。Starts使用 linq 方法添加到表达式中。
这里有一个简单的代码来显示我正在尝试做什么。
string filter = "startsWith";
Expression<Func<LogRequest,bool>> exp;
exp = log => log.Message;
MyFunction(exp, filter, "My Message");
exp = log => log.ClientIP;
MyFunction(exp, filter, "192.168");
public void MyFunction(Expression<Func<LogRequest,bool>> exp, string filter, string message)
{
switch (filter)
{
case "StartsWith":
{
exp = exp.AndAlso(exp.StartsWith(message));
break;
}
case "Contains":
{
exp = exp.AndAlso(exp.Contains(message));
break;
}
}
这里是 AndAlso 函数,它是一个 Expression 扩展方法
public static Expression<Func<T, bool>> AndAlso<T>(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
{
var invokedExpr = Expression.Invoke(right, left.Parameters);
return Expression.Lambda<Func<T, bool>>(Expression.AndAlso(left.Body, invokedExpr), left.Parameters);
}
我想这样做,因为我在 LogRequest 类中有超过 15 个属性将使用相同的逻辑,并且我不想破坏 DRY 原则。
因此,在此之后的表达式 exp 的预期值应为
exp = log => log.Message.StartsWith("My Message") && log.ClientIP.StartsWith("192.168");
答: 暂无答案
评论