首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何检查两个Expression <Func <T,bool >>是否相同

要检查两个Expression <Func <T,bool >>是否相同,可以使用以下方法:

  1. 将两个Expression <Func <T,bool >>转换为字符串表示形式,然后比较字符串是否相同。
  2. 使用ExpressionVisitor类来递归地比较两个Expression <Func <T,bool >>的节点是否相同。
  3. 使用ExpressionEqualityComparer类来比较两个Expression <Func <T,bool >>是否相同。

以下是示例代码:

代码语言:csharp
复制

public static bool AreExpressionsEqual<T>(Expression<Func<T, bool>> expr1, Expression<Func<T, bool>> expr2)

{

代码语言:txt
复制
// 方法1:将两个Expression <Func <T,bool >>转换为字符串表示形式,然后比较字符串是否相同。
代码语言:txt
复制
string str1 = expr1.ToString();
代码语言:txt
复制
string str2 = expr2.ToString();
代码语言:txt
复制
if (str1 == str2)
代码语言:txt
复制
{
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
// 方法2:使用ExpressionVisitor类来递归地比较两个Expression <Func <T,bool >>的节点是否相同。
代码语言:txt
复制
ExpressionEqualityVisitor visitor = new ExpressionEqualityVisitor();
代码语言:txt
复制
if (visitor.Equals(expr1, expr2))
代码语言:txt
复制
{
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
// 方法3:使用ExpressionEqualityComparer类来比较两个Expression <Func <T,bool >>是否相同。
代码语言:txt
复制
ExpressionEqualityComparer comparer = new ExpressionEqualityComparer();
代码语言:txt
复制
if (comparer.Equals(expr1, expr2))
代码语言:txt
复制
{
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
return false;

}

public class ExpressionEqualityVisitor : ExpressionVisitor

{

代码语言:txt
复制
private readonly Stack<Expression> _expressions = new Stack<Expression>();
代码语言:txt
复制
public bool Equals(Expression x, Expression y)
代码语言:txt
复制
{
代码语言:txt
复制
    _expressions.Clear();
代码语言:txt
复制
    _expressions.Push(x);
代码语言:txt
复制
    _expressions.Push(y);
代码语言:txt
复制
    return Visit(x, y);
代码语言:txt
复制
}
代码语言:txt
复制
protected override bool Visit(Expression x, Expression y)
代码语言:txt
复制
{
代码语言:txt
复制
    if (x == null && y == null)
代码语言:txt
复制
    {
代码语言:txt
复制
        return true;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (x == null || y == null || x.NodeType != y.NodeType || x.Type != y.Type)
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    switch (x.NodeType)
代码语言:txt
复制
    {
代码语言:txt
复制
        case ExpressionType.Negate:
代码语言:txt
复制
        case ExpressionType.NegateChecked:
代码语言:txt
复制
        case ExpressionType.Not:
代码语言:txt
复制
        case ExpressionType.Convert:
代码语言:txt
复制
        case ExpressionType.ConvertChecked:
代码语言:txt
复制
        case ExpressionType.ArrayLength:
代码语言:txt
复制
        case ExpressionType.Quote:
代码语言:txt
复制
        case ExpressionType.TypeAs:
代码语言:txt
复制
        case ExpressionType.UnaryPlus:
代码语言:txt
复制
            return VisitUnary((UnaryExpression)x, (UnaryExpression)y);
代码语言:txt
复制
        case ExpressionType.Add:
代码语言:txt
复制
        case ExpressionType.AddChecked:
代码语言:txt
复制
        case ExpressionType.Subtract:
代码语言:txt
复制
        case ExpressionType.SubtractChecked:
代码语言:txt
复制
        case ExpressionType.Multiply:
代码语言:txt
复制
        case ExpressionType.MultiplyChecked:
代码语言:txt
复制
        case ExpressionType.Divide:
代码语言:txt
复制
        case ExpressionType.Modulo:
代码语言:txt
复制
        case ExpressionType.And:
代码语言:txt
复制
        case ExpressionType.AndAlso:
代码语言:txt
复制
        case ExpressionType.Or:
代码语言:txt
复制
        case ExpressionType.OrElse:
代码语言:txt
复制
        case ExpressionType.LessThan:
代码语言:txt
复制
        case ExpressionType.LessThanOrEqual:
代码语言:txt
复制
        case ExpressionType.GreaterThan:
代码语言:txt
复制
        case ExpressionType.GreaterThanOrEqual:
代码语言:txt
复制
        case ExpressionType.Equal:
代码语言:txt
复制
        case ExpressionType.NotEqual:
代码语言:txt
复制
        case ExpressionType.Coalesce:
代码语言:txt
复制
        case ExpressionType.ArrayIndex:
代码语言:txt
复制
        case ExpressionType.RightShift:
代码语言:txt
复制
        case ExpressionType.LeftShift:
代码语言:txt
复制
        case ExpressionType.ExclusiveOr:
代码语言:txt
复制
            return VisitBinary((BinaryExpression)x, (BinaryExpression)y);
代码语言:txt
复制
        case ExpressionType.TypeIs:
代码语言:txt
复制
            return VisitTypeIs((TypeBinaryExpression)x, (TypeBinaryExpression)y);
代码语言:txt
复制
        case ExpressionType.Conditional:
代码语言:txt
复制
            return VisitConditional((ConditionalExpression)x, (ConditionalExpression)y);
代码语言:txt
复制
        case ExpressionType.Constant:
代码语言:txt
复制
            return VisitConstant((ConstantExpression)x, (ConstantExpression)y);
代码语言:txt
复制
        case ExpressionType.Parameter:
代码语言:txt
复制
            return VisitParameter((ParameterExpression)x, (ParameterExpression)y);
代码语言:txt
复制
        case ExpressionType.MemberAccess:
代码语言:txt
复制
            return VisitMemberAccess((MemberExpression)x, (MemberExpression)y);
代码语言:txt
复制
        case ExpressionType.Call:
代码语言:txt
复制
            return VisitMethodCall((MethodCallExpression)x, (MethodCallExpression)y);
代码语言:txt
复制
        case ExpressionType.Lambda:
代码语言:txt
复制
            return VisitLambda((LambdaExpression)x, (LambdaExpression)y);
代码语言:txt
复制
        case ExpressionType.New:
代码语言:txt
复制
            return VisitNew((NewExpression)x, (NewExpression)y);
代码语言:txt
复制
        case ExpressionType.MemberInit:
代码语言:txt
复制
            return VisitMemberInit((MemberInitExpression)x, (MemberInitExpression)y);
代码语言:txt
复制
        case ExpressionType.ListInit:
代码语言:txt
复制
            return VisitListInit((ListInitExpression)x, (ListInitExpression)y);
代码语言:txt
复制
        case ExpressionType.NewArrayInit:
代码语言:txt
复制
        case ExpressionType.NewArrayBounds:
代码语言:txt
复制
            return VisitNewArray((NewArrayExpression)x, (NewArrayExpression)y);
代码语言:txt
复制
        case ExpressionType.Invoke:
代码语言:txt
复制
            return VisitInvocation((InvocationExpression)x, (InvocationExpression)y);
代码语言:txt
复制
        case ExpressionType.Index:
代码语言:txt
复制
            return VisitIndex((IndexExpression)x, (IndexExpression)y);
代码语言:txt
复制
        case ExpressionType.Extension:
代码语言:txt
复制
            return VisitExtension(x, y);
代码语言:txt
复制
        default:
代码语言:txt
复制
            throw new NotSupportedException(string.Format("Unhandled expression type: '{0}'", x.NodeType));
代码语言:txt
复制
    }
代码语言:txt
复制
}
代码语言:txt
复制
protected override Expression VisitBinary(BinaryExpression x, BinaryExpression y)
代码语言:txt
复制
{
代码语言:txt
复制
    if (!Equals(x.Method, y.Method))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!Visit(x.Left, y.Left))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!Visit(x.Right, y.Right))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    return true;
代码语言:txt
复制
}
代码语言:txt
复制
protected override Expression VisitConditional(ConditionalExpression x, ConditionalExpression y)
代码语言:txt
复制
{
代码语言:txt
复制
    if (!Visit(x.Test, y.Test))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false;
代码语言:txt
复制
    }
代码语言:txt
复制
    if (!Visit(x.IfTrue, y.IfTrue))
代码语言:txt
复制
    {
代码语言:txt
复制
        return false
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

没有搜到相关的视频

领券