在下面的方法中,我尝试使用List<string>().Contains()
方法创建表达式。
问题是我需要检查列表中是否存在的值不是字符串类型,因此我需要转换它。
private static Expression<Func<Books, bool>> GenerateListContainsExpression(string propertyName, List<string> values)
{
var parameter = Expression.Parameter(typeof(Books), "b");
var property = Expression.Property(parameter, propertyName);
var method = typeof(List<string>).GetMethod("Contains");
var comparison = Expression.Call(Expression.Constant(values), method, Expression.Constant(Expression.Convert(property, typeof(string))));
return Expression.Lambda<Func<Books, bool>>(comparison, parameter);
}
这给我一个错误说:
“类型'System.Nullable`1 [System.Int32]'和'System.String'之间没有定义强制运算符。”
不保证该值的类型为int?
有没有办法做到这一点?
答案 0 :(得分:2)
您可以先在属性值上调用ToString
。以下是如何执行此操作的示例:
private static Expression<Func<Books, bool>> GenerateListContainsExpression(
string propertyName,
List<string> values)
{
var parameter = Expression.Parameter(typeof(Books), "b");
var property = Expression.Property(parameter, propertyName);
var contains_method = typeof(List<string>).GetMethod("Contains");
var to_string_method = typeof(object).GetMethod("ToString");
var contains_call = Expression.Call(
Expression.Constant(values),
contains_method,
Expression.Call(property, to_string_method));
return Expression.Lambda<Func<Books, bool>>(contains_call, parameter);
}