我正在为Outlook编写一个加载项,通过单击自定义上下文菜单按钮来解析文件夹中的所有邮件。我已经连接了按钮,但是当尝试使用文件夹中的foreach循环来检查邮件时,它似乎只检查第一个。
我在这里抓住文件夹的详细信息:
void Application_FolderContextMenuDisplay(Office.CommandBar CommandBar, ***MAPIFolder Folder***)
然后我将它传递给解析器:
public void checkFolder(MAPIFolder folder)
{
MailParser parser = new MailParser();
foreach (MailItem item in folder.Items)
{
parser.parseMail(item);
}
}
这里的foreach似乎失败了。
有什么想法吗?这让我疯了。
答案 0 :(得分:1)
我对outlook对象模型并不是非常熟悉,但是我一眼就会说问题是你错误地认为文件夹中的所有项都是MailItem
个实例。它们也可以是ContactItem
之类的对象。您需要明确检查该值是否为MailItem
,如此
foreach ( object current in folder.Items ) {
MailItem mi = current as MailItem;
if ( mi != null ) {
parser.parseMail(mi);
}
}
答案 1 :(得分:1)
您应该使用 Microsoft.Office.Interop.Outlook.Extensions.Linq API,它允许类型安全检索项目:
public void checkFolder(MAPIFolder folder)
{
MailParser parser = new MailParser();
IQueryable<Mail> query = folder.Items.AsQueryable<Mail>();
foreach (MailItem wrappedItem in query)
{
parser.parseMail(wrappedItem.Item);
}
}
此处Mail
类型是OutlookItemBase<TaskItem>
的子类。它有一个Item
属性,返回MailItem
COM对象。它还可以安全地过滤掉不兼容的类型而不会抛出异常,因此您不必添加 null 检查。
Extensions API 还解决了项目缺少的基类问题,因此您最终可以通过非通用UserProperties
基类访问OutlookItem
等。此外,API支持一些属性,这些属性可以通过在Outlook端执行它们而不是通过COM在 Linq 查询中添加一些性能提升。不幸的是,它们没有很好的记录。
答案 2 :(得分:0)
我猜测MAPIFolder.Items不是强类型的,但你正在迭代它,就好像它一样。我建议一起去:
foreach(object item in folder.Items)
{
if (item is MailItem)
parser.parseMail((MailItem)item);
}
答案 3 :(得分:0)
foreach
对于实现IEnumerable
接口的集合很有用。根据{{3}},似乎特定Items
集合未实现IEnumerable
。请尝试使用for
循环:
int c = folder.Items.Count
for (i=0;i<=c;i++)
{
//Do your thing
}