2

我已经尝试了我能想到的一切,但无法弄清楚。基本上,我正在制作一个 Outlook 2010 加载项,它对传入的 HTML 格式的电子邮件进行调整,以使视障用户(尤其是视障用户)更容易访问它们。

一切正常,除了当我的加载项运行时,它实际上尝试修改原始电子邮件,无论我尝试什么,Exchange 连接的 Outlook 根本不喜欢并拒绝。我想要做的是在不修改原始邮件的情况下显示我修改后的电子邮件以及所有好东西(回复、全部回复、密件抄送等,就像您通常使用 Outlook)......也就是说,我只想要显示我修改的消息,而不是修改存储的消息或添加新消息。

如:

if (selObject is Outlook.MailItem)
{
    Outlook.MailItem mailItem = (selObject as Outlook.MailItem);
    Outlook.MailItem accessible_mail_item = mailItem;
    ...rest of my code...
    accessible_mail_item.Display(false);
}

我遇到的问题是,“accessible_mail_item”不是“mailItem”的副本......它是指向它的指针。如何复制/克隆这个不可序列化/可克隆的对象?我已经尝试过各种“深度克隆”功能,但它们都给了我关于“不可序列化”或其他什么的相同错误。

4

3 回答 3

1

有什么理由不能使用该MailItem.Copy方法吗?

Outlook.MailItem mailItem = (selObject as Outlook.MailItem);
Outlook.MailItem accessible_mail_item = mailItem.Copy();
...rest of my code...
accessible_mail_item.Display(false);
于 2012-09-27T18:29:35.677 回答
0

听起来您一直在尝试将对象序列化然后反序列化回新对象(使用 BinaryFormatter 或类似方法)的 Deep Clone 方法,从而创建克隆。当然,这要求您要克隆的对象是可序列化的。

您是否尝试过任何其他深度克隆方法?(例如,反射、IL、ExpressionTrees)。使用这些中的任何一个都应该比序列化方法快很多,并且不需要用 Serializable 标记对象或实现 ICloneable。

在此处尝试IL 深度克隆实现,或在此处尝试反射、表达式树方法。

于 2012-09-26T02:51:05.860 回答
0

如果类不是为支持复制/克隆操作而设计的,那么您不太可能想出能够产生功能性克隆的代码。对于代表不同外部实体或资源的对象尤其如此。即,您是否希望通过克隆HttpResponse或通过克隆相应的托管对象来创建重复的 SQL 服务器来创建远程服务器页面的副本?与 Outlook 消息相同 - 将邮件项目表示为托管代码的对象不是实际的邮件项目,而是在某处获取/修改邮件项目的评估方法。

我建议查看 Outlook API,看看是否有一种方法可以按照您想要的方式创建项目的副本。您也可以尝试通过 Outlook API 创建新邮件项目,而不是手动复制您感兴趣的属性。

于 2012-09-26T04:37:14.447 回答