![](/img/trans.png)
[英]How can I compare Word Interop objects for "reference equality" AND determine collection or parent object to which, say, a paragraph belongs?
[英]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.