测试Lambda表达式相等性的最有效方法

给定方法签名:

public bool AreTheSame<T>(Expression<Func<T, object>> exp1, Expression<Func<T, object>> exp2)

如果两个表达式相同,最有效的说法是什么?这只需要用于简单的表达式,这意味着所有“受支持的”都是简单的MemberExpressions,例如c

=>c.ID。

一个示例调用可能是:

AreTheSame<User>(u1 => u1.ID, u2 => u2.ID); --> would return true

回答:

嗯…我想您必须解析树,检查每个树的节点类型和成员。我举一个例子…

using System;

using System.Linq.Expressions;

class Test {

public string Foo { get; set; }

public string Bar { get; set; }

static void Main()

{

bool test1 = FuncTest<Test>.FuncEqual(x => x.Bar, y => y.Bar),

test2 = FuncTest<Test>.FuncEqual(x => x.Foo, y => y.Bar);

}

}

// this only exists to make it easier to call, i.e. so that I can use FuncTest<T> with

// generic-type-inference; if you use the doubly-generic method, you need to specify

// both arguments, which is a pain...

static class FuncTest<TSource>

{

public static bool FuncEqual<TValue>(

Expression<Func<TSource, TValue>> x,

Expression<Func<TSource, TValue>> y)

{

return FuncTest.FuncEqual<TSource, TValue>(x, y);

}

}

static class FuncTest {

public static bool FuncEqual<TSource, TValue>(

Expression<Func<TSource,TValue>> x,

Expression<Func<TSource,TValue>> y)

{

return ExpressionEqual(x, y);

}

private static bool ExpressionEqual(Expression x, Expression y)

{

// deal with the simple cases first...

if (ReferenceEquals(x, y)) return true;

if (x == null || y == null) return false;

if ( x.NodeType != y.NodeType

|| x.Type != y.Type ) return false;

switch (x.NodeType)

{

case ExpressionType.Lambda:

return ExpressionEqual(((LambdaExpression)x).Body, ((LambdaExpression)y).Body);

case ExpressionType.MemberAccess:

MemberExpression mex = (MemberExpression)x, mey = (MemberExpression)y;

return mex.Member == mey.Member; // should really test down-stream expression

default:

throw new NotImplementedException(x.NodeType.ToString());

}

}

}

以上是 测试Lambda表达式相等性的最有效方法 的全部内容, 来源链接: utcz.com/qa/401083.html

回到顶部