为什么这个刷子的#00FFFFFF值不等于Brushes.Transparent?

我正在通过另一个类的reflection检索画笔列表。 我想确保此List中的某些Brush 不是透明的( #00FFFFFF )。 但是,将它与Brushes.Transparent进行比较会返回false,即使该值实际上是#00FFFFFF

 var brushes = GetListOfBrushes(); var brush = brushes.First(c => c != Brushes.Transparent); Console.WriteLine(brush); // Prints "#00FFFFFF" 

在这种情况下唯一可靠的方法是检查它的字符串表示,如果它以“#00”开头,感觉很黑。

在下面的示例屏幕截图中,从First()调用返回的Brush与谓词匹配,尽管它不应该:

在此处输入图像描述

由于您比较画笔,您可能想要进行Cast()或者如果它们不是全纯色(即默认情况下Cast() ,则进行一些预过滤。

然后,您可以将brush.ColorBrushes.Transparent.Color进行比较。

从您的字符串表示我推断您使用System.Windows.Media.Brush而不是System.Drawing.Brush

System.Windows.Media.Brush尚未实现自己的Equals()版本。 所以你的比较

 c != Brushes.Transparent 

仅比较参考相等而不是相等值。 一种解决方案是比较不透明度:

 var brush = brushes.First(c => c.Opacity != Brushes.Transparent.Opacity); 

但也许你会想要比较一些更多的属性,这取决于你的需求或你想如何识别特殊刷。