繁体   English   中英

如何比较Office互操作对象的相等性?

[英]How to compare Office interop objects for equality?

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

您可以通过Namespace.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方法更改为调用CompareEntryID,而不是直接比较它们。 https://msdn.microsoft.com/en-us/library/office/ff864762.aspx

这篇文章中描述的使用Applicaton.GetObjectReference对我有用。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM