比较表达式<t> </t>

时间:2011-03-23 13:27:13

标签: .net expression-trees

  

可能重复:
  C#: Checking if two Expression<Func<T, bool>> are the same

我有一堆Expression<Func<T, bool>>谓词,我想比较它们的平等性。有没有办法做到这一点?

背景:我的库将项目排序为“bins”,由谓词是否返回true来控制。如果调用者想要创建一个新的bin,我想看看bin是否已经存在。

3 个答案:

答案 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)

或许比较BodyParametersReturnType应该足够了吗?至少,这应该捕获使用相同委托来构造表达式的情况。

如果没有,更深入的比较(查看Body内部?)可能会有所帮助。

然而,比较Expression s(不是Expression<T> s)似乎并不容易,我没有找到那里的孩子,并且对可能的表达类型进行大的转换将是邪恶的。