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

时间:2015-07-30 22:06:47

标签: c# com outlook vsto office-interop

我有一个Outlook调用的事件处理程序,将Outlook.MailItem作为参数传递。稍后,Outlook再次使用不同的Outlook.MailItem调用我的处理程序。如何确定两个MailItem引用是否都引用相同的基础Outlook电子邮件?我试过' =='和两个MailItem引用上的ReferenceEquals应该是相同的,但==和ReferenceEquals都是假的。

3 个答案:

答案 0 :(得分:3)

You Namespace.CompareEntryIDs passing the entry ids of the two objects. Never compare entry ids directly - multiple entry ids can refer to the same object.

答案 1 :(得分:2)

只要项目未移动到新商店,您就可以使用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(其他)​​。见例子 -

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.CompareEntryID来比较两个EntryID。您可以继续使用MailItem的包装器,但更改Equals方法以调用CompareEntryID而不是直接比较它们。 https://msdn.microsoft.com/en-us/library/office/ff864762.aspx

答案 2 :(得分:0)

使用Applicaton.GetObjectReference帖子中描述的this为我工作。

var ref1 = Application.GetObjectReference(mailItem1, OlReferenceType.olWeak);
var ref2 = Application.GetObjectReference(mailItem2, OlReferenceType.olWeak);
// Now you can compare the two