C#Cloning对象既不实现IClonable也不实现ISerializable

时间:2012-09-26 02:23:02

标签: c# serialization outlook ms-office clone

我已经尝试了我能想到的一切,但无法弄明白这一点。基本上,我正在制作一个Outlook 2010加载项,用于调整传入的HTML格式的电子邮件,以使其更容易被视障用户(特别是视障用户)访问。

一切正常,但是当我的加载项运行时,它实际上会尝试修改原始电子邮件,无论我尝试什么,哪个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”的副本......它是指向它的指针。如何复制/克隆此非Serializable / Clonable对象?我已经尝试了各种“深度克隆”功能,但它们都给了我关于“不可序列化”或类似的错误。

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

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