将表达式谓词的左侧转换为字符串
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
方法(注意 null
s!)或 Convert.ChangeType
。自己的 AsString
方法适用于自定义类型和...调试。
考虑建筑规范:
p => AsString((object)p.Column) == "23"
我有一个通用方法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
方法(注意 null
s!)或 Convert.ChangeType
。自己的 AsString
方法适用于自定义类型和...调试。
考虑建筑规范:
p => AsString((object)p.Column) == "23"