/// <summary> /// 创建一个类型实例属性的条件表达式。形如 : o=>o.PropertyName == value /// </summary> /// <param name="objectType">实例类型。</param> /// <param name="propertyName">属性名称。</param> /// <param name="condition">条件运算样式。</param> /// <param name="value">要进行比较的常值。</param> public static LambdaExpression MakePropertyConditionLambda(Type objectType, string propertyName, ConditionStyle condition, object value) { Guard.ArgumentNotNull(objectType, "objectType"); Guard.ArgumentNullOrWhiteSpaceString(propertyName, "propertyName"); PropertyInfo propertyInfo = GetPropertyInfo(objectType, propertyName, BindingFlags.Public | BindingFlags.Instance); var constant = (Expression)Expression.Constant(value); if (value != null && !propertyInfo.PropertyType.Equals(value)) { constant = Expression.Convert(constant, propertyInfo.PropertyType); } var parameter = Expression.Parameter(objectType, "o"); var property = Expression.Property(parameter, propertyInfo); Expression body = null; switch (condition) { case ConditionStyle.GreaterThan: body = Expression.GreaterThan(property, constant); break; case ConditionStyle.GreaterThanOrEqual: body = Expression.GreaterThanOrEqual(property, constant); break; case ConditionStyle.LessThan: body = Expression.LessThan(property, constant); break; case ConditionStyle.LessThanOrEqual: body = Expression.LessThanOrEqual(property, constant); break; case ConditionStyle.NotEquals: body = Expression.NotEqual(property, constant); break; default: body = Expression.Equal(property, constant); break; } return(Expression.Lambda(body, parameter)); }
/// <summary> /// 创建一个类型实例属性的条件表达式。 /// </summary> /// <typeparam name="T">要对属性进行比较的类型。</typeparam> /// <typeparam name="TProperty">属性类型。</typeparam> /// <param name="propertyExpression">属性表达式。</param> /// <param name="condition">条件运算样式。</param> /// <param name="value">要进行比较的常值。</param> public static Expression <Func <T, bool> > MakePropertyConditionLambda <T, TProperty>(Expression <Func <T, TProperty> > propertyExpression, ConditionStyle condition, object value) { return((Expression <Func <T, bool> >)MakePropertyConditionLambda(typeof(T), propertyExpression.GetMemberName(), condition, value)); }