我正在尝试比较2个画笔,如图所示。我不知道为什么失败......
答案 0 :(得分:4)
它们不相等,因为它正在进行参考比较,它们是堆中具有相同属性的两个不同引用。
如果要控制对象比较,则应实现IEqualtable
接口。然后,您可以说明必须如何比较对象。但是,在这种情况下,由于SolidColorBrush
是.NET类,我们无法实现IEquatable
。有不同的选择
1)在SolidColorBrush
上使用扩展方法,将刷子实例与另一个实例进行比较。在这种情况下,这不是一个很好的解决方案。
2)最好的选择是使用IEqualityComparer
界面。您创建了一个实现IEqualityComparer
的单独类,它将定义如何比较2个不同的对象。例如,在您的示例中,您可能希望比较颜色和不透明度上的SolidColorBrush:
public class SolidColorBrushComparer : IEqualityComparer<SolidColorBrush>
{
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!
}
答案 1 :(得分:2)
如果对象具有相同的引用(不包括重载),则从DependencyObject
派生的类将仅相等(.Equals() == true
)。只有在使用实际相同的对象或BrushConverter.ConvertFrom
返回SolidColorBrush
的相同实例时才会出现这种情况。这种情况不太可能,而且是一种假设。
与已经提到的评论一样:尝试比较纯色画笔的Color
和/或其他属性。 Color
是一个实现IEquatable<Color>
的结构,将导致正确的行为。
来源: