/// <summary> /// 生成表达式 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="parameter">参数表达式</param> /// <param name="member">成员表达式</param> /// <param name="value">属性值</param> /// <param name="operator">操作符</param> /// <exception cref="ArgumentNullException"></exception> /// <exception cref="NotSupportedException"></exception> /// <returns></returns> public static Expression <Func <T, bool> > Create <T>(ParameterExpression parameter, MemberExpression member, object value, SQLOperator @operator) { if (parameter is null) { throw new ArgumentNullException(nameof(parameter)); } if (member is null) { throw new ArgumentNullException(nameof(member)); } switch (@operator) { case SQLOperator.Contains: case SQLOperator.EndWith: case SQLOperator.StartsWith: if (value != null && value.GetType() != typeof(string)) { throw new NotSupportedException($"{nameof(SQLOperator)}.{@operator}只适用于string类型"); } var method = typeof(string).GetMethod(@operator.ToString(), new[] { typeof(string) }); var body = Expression.Call(member, method, ConstantExpression(value, typeof(string))); return(Expression.Lambda(body, parameter) as Expression <Func <T, bool> >); default: var valueExp = ConstantExpression(value, member.Type); var binaryBody = Expression.MakeBinary((ExpressionType)@operator, member, valueExp); return(Expression.Lambda(binaryBody, parameter) as Expression <Func <T, bool> >); } }