c# outlook 实例化 Items 集合以在循环中添加项目

c# outlook instantiate Items collection to add items in loop

我正在尝试创建一个将项目移动到特定 store/folder 的应用程序。 我可以查看特定文件夹并使用 folder.items 收集项目,然后使用 foreach 循环将它们一个一个地移动。这部分工作正常。

但我还想使用拖放 Windows 表单功能添加项目。

我遇到的问题是我无法创建和实例化项目集合(零项目)。 如果我使用 null,我第一次尝试添加一个 MailItem 它会失败 (System.NullReferenceException: 'Object reference not set to an instance of an object.' ). 另外,我不能让集合没有值,因为这会使编译器失败(使用未分配的局部变量)。 我曾尝试使用 List<Outlook.MailItem>,但后来我不知道如何将其转换为 Outlook 项目集合。

这是在活动资源管理器中循环选择的事件:

        private void dataGridViewRules_DragDrop(object sender, DragEventArgs e)
        {
            Outlook.Application application = Globals.ThisAddIn.Application;
            Outlook.Explorer explorer = application.ActiveExplorer();

            //instantiate
            Outlook.Items items = null;

            foreach (MailItem mailItem in explorer.Selection)
            {
                items.Add(mailItem);
            }

            //uses a reversed for loop and uses item.move to move each MailItem
            MoveMailItemsTest(items);
        }

有什么想法吗?

您实际上还没有实例化任何东西。将 null 分配给变量意味着它是一个空引用。您需要的是构造函数调用。

最初的建议是尝试这个:

var items = new List<MailItem>();

不幸的是,这没有用,因为 Outlook.Items 本身就是一个集合 class,并且没有很好的记录。

在查看原始代码后,我的建议是完全避免创建新变量,因为它只是对现有对象的新引用。相反,将原始对象直接传递给辅助方法,如下所示:

MoveMailItemsTest(explorer.Selection);

如果您要操作、过滤等,您实际上只需要遍历对象。即便如此,LINQ 语法将为您完成大部分工作(值得学习,相信我)。

您无法创建独立的 Items 集合 - Items 对象只能存在于父文件夹 (MAPIFolder.Items) 的上下文中。但我不确定为什么你将上面的项目变量声明为 Items 而不是 List<MailItem>。仅仅是因为你现有的 MoveMailItemsTest() 方法将 Items 作为参数吗?您必须重新设计它。