2012-09-26 108 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