Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#克隆既不实现IClonable也不实现ISerializable的对象_C#_Serialization_Outlook_Ms Office_Clone - Fatal编程技术网

C#克隆既不实现IClonable也不实现ISerializable的对象

C#克隆既不实现IClonable也不实现ISerializable的对象,c#,serialization,outlook,ms-office,clone,C#,Serialization,Outlook,Ms Office,Clone,我已经尝试了我能想到的一切,但我无法解决这个问题。基本上,我正在制作一个Outlook2010插件,它对传入的HTML格式的电子邮件进行调整,以使视障用户(特别是视障用户)更容易访问这些电子邮件 一切正常,只是当我的外接程序运行时,它实际上会尝试修改原始电子邮件,无论我尝试什么,Exchange connected Outlook根本不喜欢并拒绝了。我想做的是显示我修改过的电子邮件,其中包含所有好东西(回复、全部回复、密件抄送等,就像您通常使用Outlook一样),而不修改原始邮件……也就是说,

我已经尝试了我能想到的一切,但我无法解决这个问题。基本上,我正在制作一个Outlook2010插件,它对传入的HTML格式的电子邮件进行调整,以使视障用户(特别是视障用户)更容易访问这些电子邮件

一切正常,只是当我的外接程序运行时,它实际上会尝试修改原始电子邮件,无论我尝试什么,Exchange connected 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);
}

我的问题是,“可访问的邮件项目”不是“邮件项目”的副本…它是指向它的指针。如何复制/克隆此不可序列化/可克隆对象?我尝试过各种“深度克隆”函数,但它们都会给我相同的错误,比如“不可序列化”之类的错误。

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

你有没有尝试过其他深度克隆的方法?(例如,反射、IL、表达式树)。使用其中任何一种方法都应该比序列化方法快很多,并且不需要将对象标记为Serializable或实现IClonable


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

如果类不是为支持复制/克隆操作而设计的,您就不太可能找到生成功能克隆的代码。对于表示不同外部实体或资源的对象尤其如此。也就是说,您希望通过克隆
HttpResponse
来创建远程服务器页面的副本,还是通过克隆相应的托管对象来创建重复的SQL server?Outlook邮件也是如此-表示托管代码的邮件项目的对象不是实际的邮件项目,而是在某个地方获取/修改邮件项目的评级方式


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

您有什么原因不能使用此方法吗


哦。我试过思考…运气不好。但是,我从来没有想到这个想法。尝试一下…需要几个小时,但是感谢你的建议!写问题的注意事项:避免在问题中使用“感谢便笺”(改为向上投票/评论/接受答案)和签名,因为这样的文本很少能增加问题的价值。是的,这是有原因的。调用MailItem.Copy()时,它会在收件箱中创建邮件的副本(最后在文件夹中创建同一邮件的两个副本。)Exchange不喜欢这种情况。@KendellWelch:“不喜欢”是什么意思?如果我没记错的话,副本将有一个新的唯一EntryID,您可以在创建副本后立即将其移动到另一个文件夹(隐藏和/或临时)。
Outlook.MailItem mailItem = (selObject as Outlook.MailItem);
Outlook.MailItem accessible_mail_item = mailItem.Copy();
...rest of my code...
accessible_mail_item.Display(false);