如何比较SolidColorBrushes?

我正在尝试比较2个画笔,如图中所示。 我不知道为什么它失败了……

同等失败

它们不相等,因为它正在进行引用比较,它们是具有相同属性的堆中的两个不同引用。

如果要控制对象比较,则应实现IEqualtable接口。 然后,您可以说明必须如何比较对象。 但是在这种情况下,由于SolidColorBrush是一个.NET类,我们无法实现IEquatable 。 有不同的选择

1)在SolidColorBrush上使用扩展方法,将刷子实例与另一个刷子实例进行比较。 虽然在这种情况下不是一个很好的解决方案。

2)最好的选择是使用IEqualityComparer接口。 您创建一个实现IEqualityComparer的单独类,它将定义如何比较2个不同的对象。 例如,在您的示例中,您可能希望比较颜色和不透明度上的SolidColorBrush:

 public class SolidColorBrushComparer : IEqualityComparer { public bool Equals(SolidColorBrush x, SolidColorBrush y) { return x.Color == y.Color && x.Opacity == y.Opacity; } public int GetHashCode(SolidColorBrush obj) { return new { C = obj.Color, O = obj.Opacity }.GetHashCode(); } } 

然后比较你只需执行以下操作:

 SolidColorBrush otherBrush = (SolidColorBrush)(new BrushConverter().ConvertFrom("#FFEFEEEE")); SolidColorBrush backgroundBrush = (SolidColorBrush)grd.Background; if(new SolidColorBrushComparer().Equals(backgroundBrush, otherBrush)) { // They're equal, Yay! } 

如果对象具有相同的引用(不包括重载),则从DependencyObject派生的类将仅相等( .Equals() == true )。 仅当使用实际相同的对象时,才会出现这种情况,或者BrushConverter.ConvertFrom返回SolidColorBrush的相同实例。 这种情况不太可能,而且是一个假设。

与已经提到的评论一样:尝试比较纯色画笔的Color和/或其他属性。 Color是一个实现IEquatable的结构,将导致正确的行为。

资料来源: