在C#中,如何在动态快速代码中添加空检查

时间:2011-04-09 23:00:31

标签: c# lambda expression

我正在利用this project to use jqgrid to filter and sort collections。我看到的一个问题是,当循环遍历集合并检查字符串字段的属性为空时,下面的代码将会爆炸。我想调整下面的代码,以便创建一个lambda,它不仅可以执行“ToString()”和“Contains”,还可以支持属性为null(并将其视为string.empty)

我在这个函数中基本上有2个输入:

  1. 字段名
  2. 数据值
  3. ,下面的代码动态构建一个表达式来遍历集合,并针对映射到传入的FieldName的属性检查“包含”。

    我的代码如下:

            ParameterExpression parameter = Expression.Parameter(query.ElementType, "p");
    
            MemberExpression memberAccess = null;
            MethodCallExpression memberAccessToString = null;
            foreach (var property in column.Split('.'))
            {
                memberAccess = MemberExpression.Property(memberAccess ?? (parameter as Expression), property);
                memberAccessToString = MemberExpression.Call(memberAccess, "ToString", new Type[] {}, new Expression[] {});
            }
    
            Expression condition = null;
            LambdaExpression lambda = null;
                case WhereOperation.Contains:
                    condition = Expression.Call(memberAccessToString,
                        typeof(string).GetMethod("Contains"),
                        Expression.Constant(value));
                    lambda = Expression.Lambda(condition, parameter);
    
            MethodCallExpression result = Expression.Call(
                   typeof(Queryable), "Where",
                   new[] { query.ElementType },
                   query.Expression,
                   lambda);
    
            return query.Provider.CreateQuery<T>(result);
    

1 个答案:

答案 0 :(得分:1)

在调用 ToString()

之前,您是否检查过Expression.Coalesce是否可以将其应用于memberAccess
memberAccess = MemberExpression.Property(memberAccess ?? (parameter as Expression), property);
memberAccessToString = MemberExpression.Call(Expression.Coalesce(memberAccess,Expression.Constant(string.Empty)), "ToString", new Type new Type[] {}, new Expression[] {});

没有测试它,但可能导致解决方案