【发布时间】:2013-12-06 15:57:47
【问题描述】:
我有一个具有位图属性的类。我已经为该对象实现了一个 Equals 覆盖,但我遇到了位图比较问题。这是我所拥有的:
[Serializable]
public class Contact
{
public string Name { get; set; }
public Bitmap Photo { get; set; }
public override bool Equals(object obj)
{
if (obj == null) { return false; }
if (obj.GetType() != typeof(Contact)) { return false; }
Contact compareContact = obj as Contact;
if (compareContact.FirstName != this.FirstName) { return false; }
if (compareContact.Photo != null && this.Photo != null)
{
if (!compareContact.Photo.IsEqual(this.Photo)) { return false; }
}
else
{
if (!(compareContact.Photo == null && this.Photo == null)) { return false; }
}
return true;
}
}
public static class BitmapExtensions
{
public static bool IsEqual(this Bitmap image1, Bitmap image2)
{
if (image1 == null || image2 == null)
{
return false;
}
byte[] image1Bytes = image1.ToByteArray();
byte[] image2Bytes = image2.ToByteArray();
bool sequenceEqual = image1Bytes.SequenceEqual(image2Bytes);
return sequenceEqual;
}
public static byte[] ToByteArray(this Bitmap image)
{
using (MemoryStream ms = new MemoryStream())
{
image.Save(ms, ImageFormat.Bmp);
return ms.ToArray();
}
}
}
我的测试:
[TestClass()]
public class vCardTest
{
private Contact TestContact()
{
Contact contact = new Contact();
contact.Name = "Joe";
contact.Photo = new System.Drawing.Bitmap(1, 1);
}
[TestMethod]
public void EqualsTest()
{
Contact matchedContact = Common.Copy<Contact >(TestContact);
Assert.AreEqual<vCard>(vcf, matchedVCard);
}
还有我的复制方法:
public static T Copy<T>(T objectToCopy) where T : class
{
byte[] serializedObject = objectToCopy.Serialize();
T copy = serializedObject.Deserialize(typeof(T)) as T;
return copy;
}
我的 Equals 函数返回 false。当我查看原始位图和副本的字节数组时,我注意到数组中 58 个字节中有两个字节相差 1。两个字节数组具有相同的长度。
我正在尝试确定序列化和反序列化位图以制作副本是否导致问题或其他原因。
更新
Common.Copy 方法似乎没有导致问题,这个带有字节数组的代码可以成功运行:
[TestMethod()]
public void ByteArrayCommonCopyTest()
{
byte[] byteArray1 = new byte[] { 0, 1, 1, 0, 123, 45, 56, 0 };
byte[] byteArray2 = Common.Copy<byte[]>(byteArray1);
bool expected = true;
bool actual;
actual = byteArray1.SequenceEqual(byteArray2);
Assert.AreEqual(expected, actual);
}
有趣的是,如果我将 Photo 更新为具有相同大小的新位图,它可以工作:
[TestMethod]
public void EqualsTest()
{
Contact matchedContact = Common.Copy<Contact>(TestContact);
matchedContact.Photo = new System.Drawing.Bitmap(1, 1)
Assert.AreEqual<vCard>(vcf, matchedVCard);
}
【问题讨论】:
-
你的
Equals方法中一定有Not all paths returns value编译器错误。 -
很好,我删除了一些属性以保持示例简单。我在代码中修复了它。