2012-09-26 35 views
2

我试过了所有我能想到的东西,但都无法弄清楚。基本上,我制作了一个Outlook 2010加载项,用于调整传入的HTML格式的电子邮件,以便让视觉障碍用户(尤其是视觉障碍用户)更易于访问。C#克隆既不实现IClonable也不实现ISerializable的对象

一切正常,除了当我的插件运行时,无论我尝试什么,它实际上都会尝试修改原始电子邮件,哪些Exchange连接的Outlook根本不喜欢并拒绝。我想要做的就是在不修改原始信息的情况下显示修改后的电子邮件信息(回复,全部回复,BCC等,就像您通常使用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”的副本...这是一个指针。我如何制作这个不可序列化/可复制对象的复制/克隆?我已经尝试了各种“深层克隆”功能,但它们都给了我“关于不可序列化”或类似的错误。

+0

注:这个问题是这样的文本避免“感谢信”(给予好评/评论/接受答案,而不是)和签名是很少的问题增加价值。 –

回答

0

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

您是否尝试过其他方法进行深度克隆? (例如Reflection,IL,ExpressionTrees)。使用任何这些应该比序列化方法更快,并且不要求使用Serializable标记对象或实现ICloneable。

尝试使用here进行IL深度克隆实现,或使用here进行反射,表达式树方法。

+0

Oooo。尝试反思...没有运气。但是,我的想法从来没有出现过。要尝试一下......会花上几个小时,但欣赏这个建议! –

0

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

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

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); 
+0

是的,有一个原因。当调用MailItem.Copy()时,它实际上在收件箱中创建了一个消息副本(最终在该文件夹中有两个相同消息副本。)Exchange不喜欢这样做。 –

+0

@KendellWelch:你是什么意思“不喜欢这个”?如果我没有记错,该副本将具有新的唯一EntryID,并且您可以在创建后立即将其移动到另一个文件夹(隐藏和/或临时)。 – Douglas