Example #1
0
        /// <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));
        }
Example #2
0
 /// <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));
 }