如何比较Office互操作对象是否相等
本文关键字:对象 互操作 是否 Office 何比较 比较 | 更新日期: 2023-09-27 18:05:43
我有一个Outlook调用的事件处理程序,传递一个Outlook。MailItem作为参数。稍后,Outlook用不同的Outlook. mailitem再次调用我的处理程序。如何确定两个MailItem引用是否指向相同的底层Outlook电子邮件?我尝试了'=='和ReferenceEquals对两个MailItem引用应该是相同的,但是==和ReferenceEquals都是假的。
您的命名空间。CompareEntryIDs传递两个对象的表项id。永远不要直接比较条目id——多个条目id可以引用同一个对象。
您可以使用MailItem。EntryID,只要商品没有被移动到新店。https://msdn.microsoft.com/EN-US/library/office/ff866458.aspx
当在其存储中创建项目时,MAPI存储提供程序分配一个唯一的ID字符串。因此,在保存或发送Outlook项目之前,不会为其设置EntryID属性。当项目移动到另一个存储时,例如,从收件箱移动到Microsoft Exchange Server公用文件夹,或从一个个人文件夹(.pst)文件移动到另一个.pst文件时,条目ID会发生变化。解决方案不应该依赖于唯一的EntryID属性,除非项不会被移动。
如果项目可能被移动到一个新的存储,另一个解决方案是将MailItem包装在你自己的类中,并有一个相等比较器来检查可以唯一标识项目的属性(发件人,主题,创建时间,大小等)。现在你可以使用MyMailItem.Equals(other)。参见示例——
public class MyMailItem
{
private readonly string _sender;
private readonly int _size;
private readonly string _subject;
private DateTime _creationTime;
public MyMailItem(MailItem mail)
{
Mail = mail;
_sender = Mail.SenderEmailAddress;
_size = Mail.Size;
_subject = Mail.Subject;
_creationTime = Mail.CreationTime;
}
public MailItem Mail { get; private set; }
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != GetType()) return false;
return Equals((MyMailItem)obj);
}
public override int GetHashCode()
{
unchecked
{
var hashCode = (_sender != null ? _sender.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ _size;
hashCode = (hashCode * 397) ^ (_subject != null ? _subject.GetHashCode() : 0);
hashCode = (hashCode * 397) ^ _creationTime.GetHashCode();
return hashCode;
}
}
protected bool Equals(MyMailItem other)
{
return string.Equals(_sender, other._sender) && _size == other._size && string.Equals(_subject, other._subject) &&
_creationTime.Equals(other._creationTime);
}
编辑:正如Dmitry所提到的,您也可以使用NameSpace。CompareEntryIDs比较两个entryid。您可以继续使用MailItem的包装器,但是将Equals方法更改为调用CompareEntryIDs,而不是直接比较它们。https://msdn.microsoft.com/en-us/library/office/ff864762.aspx
使用应用程序。这篇文章中描述的GetObjectReference对我很有用。
var ref1 = Application.GetObjectReference(mailItem1, OlReferenceType.olWeak);
var ref2 = Application.GetObjectReference(mailItem2, OlReferenceType.olWeak);
// Now you can compare the two