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