将表达式谓词的左侧转换为字符串

cast left side of expression predicate into string

我有一个通用方法return一个表达式谓词来过滤列表中的数据。

   MemberExpression member = Expression.Property(param, filter.ColumnName);
                    ConstantExpression constant = Expression.Constant(filter.TextToBeFiltered);

                    switch (filter.FilterOperation)
                    {
                        case FilterEnum.Equals:
                            return Expression.Equal(member, constant);
    }
     var res = List.Where(reqExpression).ToList();

问题是列表中的属性有些是字符串、int、guid 等,所以我想将表达式的左侧转换为字符串,因为我只需要将所有属性与字符串进行比较,如 a=> a.Id.tostring() == inputstring 那么如何在我的代码中执行它。

看看这个完整的例子:

class Program
{
    class MyType
    {
        public int Column { get; set; }
    };

    public static string AsString(object obj)
    {
        return obj?.ToString();
    }

    static void Main(string[] args)
    {
        var param = Expression.Parameter(typeof(MyType));
        //your member
        MemberExpression member = Expression.Property(param, "Column");
        var asString = typeof(Program).GetMethod("AsString");
        var stringMember = Expression.Call(asString, Expression.Convert(member, typeof(object)));
        //your value
        ConstantExpression constant = Expression.Constant("23");
        //your switch
        var expression = Expression.Equal(stringMember, constant);

        var lambda = Expression.Lambda(expression, param);
        var list = new List<MyType>
        {
            new MyType{Column = 23},
            new MyType{Column= 24}
        };
        var res = list.Where((Func<MyType,bool>)lambda.Compile()).ToList();
    }
}

您也可以使用 ToString 方法(注意 nulls!)或 Convert.ChangeType。自己的 AsString 方法适用于自定义类型和...调试。

考虑建筑规范:

p => AsString((object)p.Column) == "23"