我有一个名为User的类,其中有一个字段,用户可以发送任何数据类型。目前我们发送int,double和string。
由于字段是动态的,因此字段名称可以是我们使用表达式树的任何内容。我现在面临的问题是如果select字段或字段值中的字段为null,则会抛出错误。
以下是我的代码:
Expression<Func<User, bool>> comparison = null;
if (Value.GetType() == typeof(int))
comparison = EvaluateRules<int>(attributeName);
else if (Value.GetType() == typeof(double))
comparison = EvaluateRules<double>(attributeName);
else if (Value.GetType() == typeof(string))
comparison = EvaluateRules<string>(attributeName);
private Expression<Func<User, bool>> EvaluateRules<T>(string attributeName)
{
var attributeParameter = Expression.Parameter(typeof(User), "user");
Expression<Func<User, bool>> comparison = null;
var parseMethod = typeof(T).GetMethod("Parse", new[] { typeof(string) });
switch (policyOperator)
{
case Operator.GreaterThanOrEqual:
if (Value.GetType() != typeof(string))
comparison = Expression.Lambda<Func<User, bool>>(
Expression.GreaterThanOrEqual(
Expression.Call(parseMethod, Expression.Property(attributeParameter, attributeName)),
Expression.Constant(Value)),
attributeParameter);
break;
}
return comparison;
}
resultUsers = from user in users.AsQueryable().Where(comparison) select user
任何线索??
感谢您的时间。
答案 0 :(得分:2)
感谢您的回复。我能够用下面的代码解决它。发布它,以防它帮助某人。
ParameterExpression attributeParameter = Expression.Parameter(typeof(User), "user");
MemberExpression attribute = Expression.Property(attributeParameter, attributeName);
BinaryExpression nullCheck = Expression.NotEqual(attribute, Expression.Constant(null, typeof(object)));
BinaryExpression condition = null;
switch (policyOperator)
{
case Operator.GreaterThanOrEqual:
if (Value.GetType() != typeof(string))
condition = Expression.GreaterThanOrEqual(Expression.Call(parseMethod,
Expression.Property(attributeParameter, attributeName)),
Expression.Constant(Value));
.
.
}
return Expression.Lambda<Func<User, bool>>(Expression.AndAlso(nullCheck, condition), attributeParameter);