【问题标题】:C# Cloning Objects that implement neither IClonable or ISerializable既不实现 IClonable 也不实现 ISerializable 的 C# 克隆对象
【发布时间】:2012-09-17 14:31:28
【问题描述】:

我已经尝试了所有我能想到的但无法解决的问题。基本上,我正在制作一个 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”的副本......它是指向它的指针。如何复制/克隆这个不可序列化/可克隆的对象?我已经尝试过各种“深度克隆”功能,但它们都给了我关于“不可序列化”或其他什么的相同错误。

【问题讨论】:

  • 关于写问题的注意事项:避免“感谢信”(而不是赞成/评论/接受答案)和问题中的签名,因为这样的文字很少会增加问题的价值。

标签: c# serialization outlook ms-office clone


【解决方案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);

【讨论】:

  • 是的,这是有原因的。调用 MailItem.Copy() 时,它实际上会在收件箱中创建邮件的副本(最终在文件夹中生成同一邮件的两个副本。)Exchange 不喜欢这样。
  • @KendellWelch:“不喜欢这个”是什么意思?如果我没记错的话,该副本将具有一个新的唯一 EntryID,并且您始终可以在创建后立即将其移动到另一个文件夹(隐藏和/或临时)。
【解决方案2】:

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

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

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

【讨论】:

  • 哦哦。尝试反射......没有运气。但是,我从来没有想到过 IL 的想法。会尝试一下...需要几个小时,但感谢您的建议!
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 2012-11-02
    • 2013-10-21
    • 2018-01-21
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多