pub*_*ess 4 c# oop outlook reference office-automation
我对C#和Office自动化比较陌生,最近我发现自己试图获取对某人的Outlook收件箱的引用并按接收时间对电子邮件进行排序.直到我在网络上的其他地方找到一个解决方案,其中将收件箱分配给Microsoft.Office.Interop.Outlook.Items类型的本地变量,然后对局部变量执行排序并且它可以工作时,它才能工作.然而,问题是为什么?我认为在C#对象中是引用,当你声明一个新的Outlook.Inbox引用然后从用户的收件箱中分配它时,它只是作为实际电子邮件的附加指针,并不实际复制每封电子邮件到一个新的集合.所以它应该与在原始参考上调用Sort无异,对吧?显然我错了,所以我很感激解释.感谢名单!
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!
Run Code Online (Sandbox Code Playgroud)
你正在进行演员表演(通过这样做(Outlook.Items)oInbox.Items).转换意味着您将类型的对象X称为类型Y.这在以下方案中有效:
X在继承层次结构中Y(意味着它是父类Y或子类Y).在X父类的情况下,如果有问题的对象实际上是 Y(或从中派生的类型Y),则强制转换只会在运行时成功Y 是一种由.实现的接口类型 XX到Y由于多态性,在第一种情况下进行转换通常不会改变函数的行为(尽管如果更多派生类型显式隐藏了父类的实现,它就可以).然而,我怀疑这是你的情景; 类型oInbox.Items是继承自Outlook.Items但隐藏实现的类型Outlook.Items.Sort.通过显式转换为父类型,您将绕过新的子实现.请注意,这种技术仅在子项隐藏函数而不是覆盖虚函数时才有效.
如果X明确实现了Y您打算使用的函数,则第二种情况可以改变行为.通过转换到接口,您明确告诉编译器您希望它将方法调用绑定到接口的实现,而不是类本身的普通面向公共的方法.
第三个几乎总是改变行为,因为你得到的是另一种类型(因而是一个完全不同的对象).
我不能说你的这些案件属于哪一个,因为我没有太多关于Office互操作的经验,但这应该回答你的基本问题"这些如何不同?"
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |