ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#中的引用和意外结果

2019-06-10 01:07:49  阅读:201  来源: 互联网

标签:c oop reference outlook 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!

解决方法:

您正在执行演员表(通过执行(Outlook.Items)oInbox.Items).转换意味着您将类型为X的对象称为类型Y.这在以下方案中有效:

> X在Y的继承层次结构内(意味着它是Y的父类或Y的子类).在X是父类的情况下,如果有问题的对象实际上是Y(或从Y派生的类型),则转换将仅在运行时成功
> Y是由X实现的接口类型
>存在从X到Y定义的显式转换

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

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

第三个几乎总是改变行为,因为你得到的是另一种类型(因而是一个完全不同的对象).

我不能说你的这些案件属于哪一个,因为我没有太多关于Office互操作的经验,但这应该回答你的基本问题“这些如何不同?”

标签:c,oop,reference,outlook,office-automation
来源: https://codeday.me/bug/20190610/1208471.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有