c#表示式擴充套件與或非 通過表示式獲取欄位屬性名稱
阿新 • • 發佈:2021-12-24
留待後查,同時方便他人public static class ExpressionHelper { #region 與或非封裝 public static Expression<Func<T, bool>> True<T>() { return param => true; } public static Expression<Func<T, bool>> False<T>() { return param => false; } public static Expression<Func<T, bool>> And<T>(this Expression<Func<T, bool>> one, Expression<Func<T, bool>> another) { //return one.Compose(another, Expression.AndAlso); return one.Compose(another, Expression.And); } public static Expression<Func<T, bool>> Or<T>(this Expression<Func<T, bool>> one, Expression<Func<T, bool>> another) { return one.Compose(another, Expression.Or); //return one.Compose(another, Expression.OrElse); } public static Expression<Func<T, bool>> Compose<T>(this Expression<Func<T, bool>> one, Expression<Func<T, bool>> another, Func<Expression, Expression, Expression> action) { //建立新引數 var newParameter = Expression.Parameter(typeof(T)); var parameterReplacer = new ParameterReplacer(newParameter); var left = parameterReplacer.Replace(one.Body); var right = parameterReplacer.Replace(another.Body); var body = action(left, right); return Expression.Lambda<Func<T, bool>>(body, newParameter); } /// <summary> /// 引數替換 /// </summary> internal class ParameterReplacer : ExpressionVisitor { public ParameterReplacer(ParameterExpression paramExpr) { Parameter = paramExpr; } //新的表示式引數 private ParameterExpression Parameter { get; set; } public Expression Replace(Expression expr) { return this.Visit(expr); } /// <summary> /// 覆蓋父方法,返回新的引數 /// </summary> /// <param name="p"></param> /// <returns></returns> protected override Expression VisitParameter(ParameterExpression p) { return Parameter; } } #endregion /// <summary> /// 獲取表示式呼叫的欄位名稱 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="expr"></param> /// <returns></returns> public static string GetPropertyName<T>(Expression<Func<T, object>> expr) { switch (expr.Body) { case MemberExpression memberExpression: return memberExpression.Member.Name; case UnaryExpression unaryExpression: if (unaryExpression.Operand is MemberExpression expression) { return expression.Member.Name; } break; default: break; } return ""; } }
聯絡我:[email protected]