如何比较Office互操作对象是否相等

本文关键字:对象 互操作 是否 Office 何比较 比较 | 更新日期: 2023-09-27 18:05:43

我有一个Outlook调用的事件处理程序,传递一个Outlook。MailItem作为参数。稍后,Outlook用不同的Outlook. mailitem再次调用我的处理程序。如何确定两个MailItem引用是否指向相同的底层Outlook电子邮件?我尝试了'=='和ReferenceEquals对两个MailItem引用应该是相同的,但是==和ReferenceEquals都是假的。

如何比较Office互操作对象是否相等

您的命名空间。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