构建字符串表达式<func <t,bool =“”>&gt; ,无视案例

时间:2015-11-29 14:37:53

标签: c# expression

我需要根据输入和提供的运算符构建自定义字符串表达式。然而,这些比较总是具有案例性。我需要在忽略案例时进行比较。

static Expression<Func<T, bool>> GetStringExpression<T>(string field, string compareOperator, string value)
    {
        var parameterExp = Expression.Parameter(typeof(T), "type");
        var propertyExp = Expression.Property(parameterExp, field);
        MethodInfo method = typeof(string).GetMethod(compareOperator, new[] { typeof(string) });
        var someValue = Expression.Constant(value, typeof(string));
        var containsMethodExp = Expression.Call(propertyExp, method, someValue);

        return Expression.Lambda<Func<T, bool>>(containsMethodExp, parameterExp);
    }

使用当前代码:

var expression = GetStringExpression<MyClass>("MyProperty", "Contains", "testValue");

var mylist = QueryableList.Where(expression).ToList();

比较&#34; test&#34;此比较不会返回true。与&#34; TEST&#34;,这种情况也应该是真的。

2 个答案:

答案 0 :(得分:0)

除非传递其他参数,否则类String上没有方法可以进行不区分大小写的比较。您可以通过多种方式进行字符串比较(文化感知,操作系统感知,案例(敏感)),每次您要比较两个字符串时,您几乎都需要使用参数。我已经开始研究代码库,即使是默认的精确比较也必须明确说明,只是为了确保开发人员不会忽视他们想要哪一个。

GIVEN:我建议您可以停止使用&#34; string&#34;类型的字段。相反,创建一个包装私有&#34;字符串&#34;字段并提供您想要的功能......新类可以具有不需要额外参数的Contains方法。您可以使用现有的字符串API编写Contains方法来操作私有字段。通过使用新课程,无论何时进行类型反射,您都可以获得您正在寻找的功能。

答案 1 :(得分:-2)

简单方法怎么样?

    static Expression<Func<T, bool>> GetStringExpression<T>(string field, string compareOperator, string value)
    {
        var parameterExp = Expression.Parameter(typeof(T), "type");
        var propertyExp = Expression.Property(parameterExp, field);
        MethodInfo method = typeof(string).GetMethod(compareOperator, new[] { typeof(string) });
        var someValue = Expression.Constant(value.ToLower(), typeof(string)); //mind the ToLower
        var containsMethodExp = Expression.Call(propertyExp, method, someValue);
        //and one more:
        var toStringMethod = typeof(object).GetMethod("ToString", Type.EmptyTypes);
        var toStringExp = Expression.Call(containsMethodExp, toStringMethod);
        var toLowerMethod = typeof(string).GetMethod("ToLower", Type.EmptyTypes);
        var toLowerExp = Expression.Call(toStringExp, toLowerMethod);

        return Expression.Lambda<Func<T, bool>>(toLowerExp, parameterExp);
    }

我没有测试它,但这个想法非常简单 - 只需对这两个值执行ToLower() ...