向表达式添加 Linq 方法

Add a Linq method to an Expression

提问人:Jawoy 提问时间:10/18/2023 最后编辑:Jawoy 更新时间:10/18/2023 访问量:87

问:

我正在尝试制作一个通用方法,该方法采用表达式并向此表达式添加方法调用。 例如,我想添加.包含 或 。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");
C# asp.net LINQ

评论

0赞 ClearlyClueless 10/19/2023
评论通常以问号结尾,您的 OP 中似乎没有问号。什么对你不起作用?什么?你的问题到底是什么?
0赞 Jawoy 10/19/2023
@ClearlyClueless我正在尝试制作类似于我提供的代码的东西。但是这段代码只是对我想做的事情的解释,而不是实际的代码。
0赞 ClearlyClueless 10/19/2023
可以理解,但是这里没有问题,stackoverflow 专门用于提问。

答: 暂无答案