using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Expressions;
using System.Text;
using System.Threading.Tasks;
namespace zzz.Common.Helper
{
public static class ExpressionExtensions
{
///
/// 组合两个表达式
///
/// 泛型类型
/// 表达式1
/// 表达式2
/// 组合方式
/// 新的表达式
public static Expression Compose(this Expression expression, Expression extendExpression, Func mergeWay)
{
var parameterExpressionSetter = expression.Parameters
.Select((u, i) => new { u, Parameter = extendExpression.Parameters[i] })
.ToDictionary(d => d.Parameter, d => d.u);
var extendExpressionBody = ParameterReplaceExpressionVisitor.ReplaceParameters(parameterExpressionSetter, extendExpression.Body);
return Expression.Lambda(mergeWay(expression.Body, extendExpressionBody), expression.Parameters);
}
///
/// 与操作合并两个表达式
///
/// 泛型类型
/// 表达式1
/// 表达式2
/// 新的表达式
public static Expression> And(this Expression> expression, Expression> extendExpression)
{
return expression.Compose(extendExpression, Expression.AndAlso);
}
///
/// 与操作合并两个表达式,支持索引器
///
/// 泛型类型
/// 表达式1
/// 表达式2
/// 新的表达式
public static Expression> And(this Expression> expression, Expression> extendExpression)
{
return expression.Compose(extendExpression, Expression.AndAlso);
}
///
/// 根据条件成立再与操作合并两个表达式
///
/// 泛型类型
/// 表达式1
/// 布尔条件
/// 表达式2
/// 新的表达式
public static Expression> AndIf(this Expression> expression, bool condition, Expression> extendExpression)
{
return condition ? expression.Compose(extendExpression, Expression.AndAlso) : expression;
}
///
/// 根据条件成立再与操作合并两个表达式,支持索引器
///
/// 泛型类型
/// 表达式1
/// 布尔条件
/// 表达式2
/// 新的表达式
public static Expression> AndIf(this Expression> expression, bool condition, Expression> extendExpression)
{
return condition ? expression.Compose(extendExpression, Expression.AndAlso) : expression;
}
///
/// 或操作合并两个表达式
///
/// 泛型类型
/// 表达式1
/// 表达式2
/// 新的表达式
public static Expression> Or(this Expression> expression, Expression> extendExpression)
{
return expression.Compose(extendExpression, Expression.OrElse);
}
///
/// 或操作合并两个表达式,支持索引器
///
/// 泛型类型
/// 表达式1
/// 表达式2
/// 新的表达式
public static Expression> Or(this Expression> expression, Expression> extendExpression)
{
return expression.Compose(extendExpression, Expression.OrElse);
}
///
/// 根据条件成立再或操作合并两个表达式
///
/// 泛型类型
/// 表达式1
/// 布尔条件
/// 表达式2
/// 新的表达式
public static Expression> OrIf(this Expression> expression, bool condition, Expression> extendExpression)
{
return condition ? expression.Compose(extendExpression, Expression.OrElse) : expression;
}
///
/// 根据条件成立再或操作合并两个表达式,支持索引器
///
/// 泛型类型
/// 表达式1
/// 布尔条件
/// 表达式2
/// 新的表达式
public static Expression> OrIf(this Expression> expression, bool condition, Expression> extendExpression)
{
return condition ? expression.Compose(extendExpression, Expression.OrElse) : expression;
}
///
/// 获取Lambda表达式属性名,只限 u=>u.Property 表达式
///
/// 泛型类型
/// 表达式
/// 属性名
public static string GetExpressionPropertyName(this Expression> expression)
{
if (expression.Body is UnaryExpression unaryExpression)
{
return ((MemberExpression)unaryExpression.Operand).Member.Name;
}
else if (expression.Body is MemberExpression memberExpression)
{
return memberExpression.Member.Name;
}
else if (expression.Body is ParameterExpression parameterExpression)
{
return parameterExpression.Type.Name;
}
throw new InvalidCastException(nameof(expression));
}
///
/// 是否是空集合
///
/// 泛型类型
/// 集合对象
/// 是否为空集合
public static bool IsNullOrEmpty(this IEnumerable sources)
{
return sources == null || !sources.Any();
}
}
}