1

カスタム コンテキスト メニュー ボタンをクリックして、フォルダ内のすべてのメールを解析する 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 です。

何か案は?これは私を夢中にさせています。

4

4 に答える 4

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>。COM オブジェクトItemを返すプロパティがあります。MailItemまた、例外をスローすることなく互換性のない型を安全に除外するため、nullチェックを追加する必要はありません。

拡張機能 APIは、アイテムの基本クラスが欠落している問題も解決するためUserProperties、非ジェネリックOutlookItem基本クラスを介して最終的にアクセスすることができます。また、API はいくつかの属性をサポートしており、COM ではなく Outlook 側で実行することで、 Linqクエリのパフォーマンスを向上させることができます。残念ながら、それらは十分に文書化されていません。

于 2010-05-07T14:11:40.743 に答える
1

私は Outlook のオブジェクト モデルにあまり詳しくありませんが、一見したところ問題は、フォルダー内のすべてのアイテムがMailItemインスタンスであると誤って想定していることだと思います。のようなオブジェクトにすることもできますContactItemMailItem値が似ているかどうかを明示的に確認する必要があります

foreach ( object current in folder.Items ) {
  MailItem mi = current as MailItem;
  if ( mi != null ) { 
    parser.parseMail(mi);
  }
}
于 2009-11-16T17:18:44.993 に答える
0

MAPIFolder.Items は強く型付けされていないと推測していますが、そうであるかのように繰り返し処理しています。私は一緒に行くことをお勧めします:

foreach(object item in folder.Items)
{
  if (item is MailItem)
    parser.parseMail((MailItem)item);
}
于 2009-11-16T17:18:32.077 に答える
0

foreachインターフェイスを実装するコレクションに役立ちIEnumerableます。MSDNによると、特定Itemsのコレクションが実装されていないようIEnumerableです。for代わりにループを使用してみてください。

int c = folder.Items.Count
for (i=0;i<=c;i++)
{
   //Do your thing
}
于 2009-11-16T17:18:38.113 に答える