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 以避免任何异常?
您可以在您的文件夹中添加不同类型的项目,例如 MailItem
、AppointmentItem
等。要使用 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 或更高版本。
我有一个 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 以避免任何异常?
您可以在您的文件夹中添加不同类型的项目,例如 MailItem
、AppointmentItem
等。要使用 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 或更高版本。