使用字符串.在表达式中比较(a, b)

本文关键字:比较 字符串 表达式 | 更新日期: 2023-09-27 18:33:51

从昨天开始,我一直在自学表达式树,但在比较两个字符串值时遇到了问题。 我做了这个失败并出现错误的测试用例:

No method 'Compare' on type 'System.String' is compatible with the supplied arguments.

运行时在left = Expression.Call(上失败

Type type = typeof(string);
Expression left, right;
left = Expression.Constant("1", type);
right = Expression.Constant("2", type);
// fails at run-time on the next statement
left = Expression.Call(
    typeof(string),
    "Compare",
    new Type[] { type, type },
    new Expression[] { left, right });
right = Expression.Constant(0, typeof(int));

我将在Expression.Equal, LessThan, LessThanOrEqual, GreaterThan or GreaterThanOrEqual中使用生成的左和右。 这就是比较方法的原因。

我确定它很简单,我已经将我的代码归结为这个简单的测试用例。 有人看到我哪里出错了吗?

使用字符串.在表达式中比较(a, b)

这是

Expression.Call代码中的问题:

new Type[] { type, type },

这是试图调用string.Compare<string, string> - 它们是通用参数,而不是正常参数的类型。鉴于它是一种非通用方法,只需在此处使用 null。

简短但完整的程序:

using System;
using System.Linq.Expressions;
class Test
{
    static void Main()
    {
        var left = Expression.Constant("1", typeof(string));
        var right = Expression.Constant("2", typeof(string));
        var compare = Expression.Call(typeof(string),
                                      "Compare",
                                      null,
                                      new[] { left, right });
        var compiled = Expression.Lambda<Func<int>>(compare).Compile();
        Console.WriteLine(compiled());
    }
}

我试图做类似于lambda where子句(LINQ到SQL)的事情,并且由于各种搜索使我进入此页面,因此我将在这里分享这样的解决方案,以防它帮助其他登陆这里的人。

当您使用比较的泛型表达式简化正在执行的操作时,这是最简单的。

    public static Expression CompareLessThanOrEqualTo(Expression e1, Expression e2)
    {
        var compare = Expression.Call(typeof(string),
                           "Compare",
                           null,
                           new[] { e1, e2 });
        return Expression.LessThanOrEqual(compare, Expression.Constant(0));
    }

然后你可以像使用任何其他表达式一样使用这个表达式

    public static Expression<Func<TypeOfParent, bool>> PropertyLessThanOrEqualString<TypeOfParent, String>(PropertyInfo property, String value)
    {
        var parent = Expression.Parameter(typeof(TypeOfParent));
        var expressionBody = CompareLessThanOrEqualTo(Expression.Property(parent, property), Expression.Constant(value));
        return Expression.Lambda<Func<TypeOfParent, bool>>(expressionBody, parent);
    }

女巫可以使用例如

public static IQueryable<T> ApplyFilters<T>(this IQueryable<T> query, List<GridFilters> gridFilters)
{
    // foreach filter
        // Get property (propertyInfo)
        // Get Value(s)
        // Apply Filter
        query = query.Where(PropertyLessThanOrEqualString<T, string>(propertyInfo, value1));
    // ...
    return query;
}

如果您有需要应用的用户选择的筛选器列表,则可以在其中选择值和运算符,这将非常有用。 (开头为、包含、范围之间)