可能重复:
C#: Checking if two Expression<Func<T, bool>> are the same
我有一堆Expression<Func<T, bool>>
谓词,我想比较它们的平等性。有没有办法做到这一点?
背景:我的库将项目排序为“bins”,由谓词是否返回true来控制。如果调用者想要创建一个新的bin,我想看看bin是否已经存在。
答案 0 :(得分:2)
您可以使用expr.ToString()
作为开头。当然,这在技术上并不太正确,因为它不会考虑结构不同但功能相同的树,也不会考虑表达式的不同命名形式参数。但它足够接近,它已经存在了。
一般来说,不同的树/相同的函数问题可能很难以到你可能不会去那里(你实际上需要构建一个编译器才能告诉两个这样的表达式是相同的)。
答案 1 :(得分:1)
编辑:也许这会有所帮助:ExpressionEqualityComparer
from Linq-to-db4o。在一个相关问题中,有some discussion about how to use this。该图书馆是开源的。
您可以开始创建类似于通用DeepEquals
方法的方法,该方法比较内部(不确定这是必要的)和外部属性和字段,但这可能很棘手,尤其是对于具有属性的getter副作用和属性未实现IComparable
或其他容易比较的对象。
这是一种可能的方法,check the method PublicInstancePropertiesEqual。
请记住,你所说的平等,可能与二元平等不一样。仅检查公共属性(只有八个)就可以了,您可以将它们放在扩展方法中。
答案 2 :(得分:0)
或许比较Body
,Parameters
和ReturnType
应该足够了吗?至少,这应该捕获使用相同委托来构造表达式的情况。
如果没有,更深入的比较(查看Body
内部?)可能会有所帮助。
然而,比较Expression
s(不是Expression<T>
s)似乎并不容易,我没有找到那里的孩子,并且对可能的表达类型进行大的转换将是邪恶的。