4

我对 C# 和 Office 自动化比较陌生,最近我发现自己试图获取对某人 Outlook 收件箱的引用并按接收时间对电子邮件进行排序。直到我在网络上的其他地方找到了一个解决方案,将收件箱分配给 Microsoft.Office.Interop.Outlook.Items 类型的局部变量,然后对局部变量执行排序并且它可以工作,它才起作用。然而,问题是为什么?我认为在 C# 中的对象是引用,当您声明一个新的 Outlook.Inbox 引用,然后将其分配给用户收件箱中的项目时,它只是作为指向实际电子邮件的附加指针,并不会实际复制每封电子邮件到一个新的集合。所以它应该与在原始引用上调用 Sort 没有什么不同,对吧?显然我错了,所以我 d感谢解释。谢谢!!

using Outlook = Microsoft.Office.Interop.Outlook;    
...
Outlook.Folder oInbox = (Outlook.Folder)oApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox);

oInbox.Items.Sort("[Received]", true); //this doesn't produce expected results
Outlook.Items inboxFolder = (Outlook.Items)oInbox.Items;
inboxFolder.Sort("[Received]", true);  //this DOES sort the items!
4

2 回答 2

6

你正在表演演员(通过做(Outlook.Items)oInbox.Items)。强制转换意味着您将类型的对象X称为 type Y。这在以下情况下有效:

  • X位于 的继承层次结构中Y(意味着它是 的父类Y或子类Y)。在 where 是父类的情况下,只有当所讨论的对象实际上(或派生自 的类型)X时,强制转换才会在运行时成功 YY
  • Y是一种接口类型,由X
  • 定义了从X到的显式转换Y

由于多态性,第一种情况下的强制转换通常不会改变函数的行为(尽管如果更多派生类型显式隐藏了父类的实现,则可以)。但是,我怀疑这是您的情况;ofoInbox.Items的类型是继承自Outlook.Items但隐藏实现的类型Outlook.Items.Sort。通过显式转换为父类型,您绕过了新的子实现。请注意,这种技术仅在孩子隐藏函数而不是覆盖虚拟函数时才有效)

如果明确实现您打算使用X的函数,则第二种情况可以改变行为。Y通过转换为接口,您明确地告诉编译器您希望它将您的方法调用绑定到接口的实现,而不是类本身的普通面向公众的方法。

第三个几乎总是改变行为,因为你得到了一个完全不同的类型(因此完全不同的object)。

我不能说您属于哪种情况,因为我对 Office 互操作没有太多经验,但这应该回答您的基本问题,即“这些情况有何不同?”

于 2012-02-09T16:27:07.463 回答
2

您不是在创建的Outlook.Inbox,而是在创建对现有收件箱的新引用。因此,排序实际上是在现有收件箱上完成的。

于 2012-02-09T16:22:26.427 回答