Outlook 加载项异常 - 如何检查 Outlook.Item 的类型?

Outlook Add-in Exception - How to check the type of Outlook.Item?

我有一个 Outlook 2013 插件,

Outlook.MAPIFolder inboxFolder;
Outlook.Items mailInboxItems;

private void ThisAddIn_Startup(object sender, EventArgs e)
{
   ... other code ---

   mailInboxItems = inboxFolder.Items;
   mailInboxItems.ItemAdd += mailInboxItems_ItemAdd;
}

private void mailInboxItems_ItemAdd(object item)
{
   Outlook.MailItem emailMessage = (Outlook.MailItem)item; // cast error
   ProcessEmail(emailMessage);
}

当然,当传入的项目不是 Outlook.MailItem 类型时会抛出异常:

Unable to cast COM object of type 'System.__ComObject' to interface type 'Microsoft.Office.Interop.Outlook.MailItem'.

如何检查参数 "item" 是否只是有效类型,即 Outlook.MailItem 以避免任何异常?

您可以在您的文件夹中添加不同类型的项目,例如 MailItemAppointmentItem 等。要使用 MailItems,请使用如下代码:

var emailMessage = item as MailItem;
if(emailMessage == null)
{
    retrun;
}

// here you can use emailMessage as MailItem
ProcessEmail(emailMessage);

您可以在 C# 中使用 "is" 和 "as" 运算符。有关详细信息,请参阅 How to: Programmatically Determine the Current Outlook Item

此外,Outlook 对象模型还提供 MessageClass 属性 - 代表 Outlook 项目的消息 class 的字符串。在幕后,消息 class 用于识别在 Outlook 中使用哪个检查器来显示项目。

首先检查的项目是像

这样的邮件项目
  if(item is Outlook.MailItem){
    Outlook.MailItem emailMessage =item as Outlook.MailItem
    ProcessEmail(emailMessage);
  }

它将如您所愿。

实际上至少有 16 种 Outlook 项目类型。逐条列出不同类型的文档有点难找,但一个参考是 here.

因此,例如,如果您想将所有项目从一个文件夹移动到另一个文件夹,您可以这样做:

    Items items = source.Items;

    foreach (object item in items)
    {
        switch (item)
        {
            case AppointmentItem appointmentItem:
                appointmentItem.Move(destination);
                break;
            case ContactItem contactItem:
                contactItem.Move(destination);
                break;
            case DistListItem distListItem:
                distListItem.Move(destination);
                break;
            case DocumentItem documentItem:
                documentItem.Move(destination);
                break;
            case JournalItem journalItem:
                journalItem.Move(destination);
                break;
            case MailItem mailItem:
                mailItem.Move(destination);
                break;
            case MeetingItem meetingItem:
                meetingItem.Move(destination);
                break;
            case NoteItem noteItem:
                noteItem.Move(destination);
                break;
            case PostItem postItem:
                postItem.Move(destination);
                break;
            case RemoteItem remoteItem:
                remoteItem.Move(destination);
                break;
            case ReportItem reportItem:
                reportItem.Move(destination);
                break;
            case TaskItem taskItem:
                taskItem.Move(destination);
                break;
            case TaskRequestAcceptItem taskRequestAcceptItem:
                taskRequestAcceptItem.Move(destination);
                break;
            case TaskRequestDeclineItem taskRequestDeclineItem:
                taskRequestDeclineItem.Move(destination);
                break;
            case TaskRequestItem taskRequestItem:
                taskRequestItem.Move(destination);
                break;
            case TaskRequestUpdateItem taskRequestUpdateItem:
                taskRequestUpdateItem.Move(destination);
                break;
        }

        Marshal.ReleaseComObject(item);
    }

case 语句中的类型匹配需要 C# 7 或更高版本。