2012-02-09 38 views
4

我對C#和Office自動化相對較新,最近我發現自己試圖獲取對某人的Outlook收件箱的引用並按收到時間對郵件進行排序。直到我在Web上的其他地方找到一個解決方案,收件箱被分配給Microsoft.Office.Interop.Outlook.Items類型的局部變量,然後在本地變量上執行排序並且它可以正常工作時,它才工作。但是,這個問題是爲什麼呢?我認爲在C#中的對象是引用,當你聲明一個新的Outlook.Inbox引用,然後爲用戶的收件箱分配項目時,它只是作爲實際電子郵件的附加指針,並且實際上不會複製每封電子郵件到一個新的集合。所以它應該與對原始參考調用Sort不同,對吧?顯然我錯了,所以我會很感激一個解釋。感謝名單!C#中的引用和意想不到的結果

using Outlook = Microsoft.Office.Interop.Outlook;  
... 
Outlook.Folder oInbox = (Outlook.Folder)oApp.Session.GetDefaultFolder(Outlook.OlDefaultFolders.olFolderInbox); 

oInbox.Items.Sort("[Received]", true); //this doesn't produce expected results 
Outlook.Items inboxFolder = (Outlook.Items)oInbox.Items; 
inboxFolder.Sort("[Received]", true); //this DOES sort the items! 
+0

oInbox.Items的類型是什麼?它可能是該類型重寫Sort方法以具有不同的行爲。通過強制轉換爲Outlook.Items,您可以從基類獲取行爲。 – cadrell0 2012-02-09 16:24:49

回答

6

您正在執行演員表(通過執行(Outlook.Items)oInbox.Items)。鑄造意味着您指的是類型爲X的對象,類型爲Y。這是有效的在下列情況:

  • XY繼承層次結構中(也就是說,它要麼父類的Y或子類的Y)。在X是父類的情況下,鑄造將僅在運行時成功,如果在實際問題的對象是Y(或從Y派生的類型)
  • Y是受X
  • 實現的接口類型
  • 還有就是Y

由於多態性從X限定的明確的轉換,在第一種情況下鑄造通常不改變的功能的行爲(thoug如果更多的派生類型明確隱藏了父項的實現,那麼它就可以)。 然而,我懷疑這是你的情況。 oInbox.Items的類型是從Outlook.Items繼承的類型,但隱藏了Outlook.Items.Sort的實現。通過顯式轉換爲父類型,您可以繞過新的子實現。請注意,這種技術只適用於兒童隱藏函數而不是覆蓋虛擬函數)

如果X明確實現您打算使用的Y函數,第二種情況可以改變行爲。通過轉換到接口,您明確地告訴編譯器,您希望它將您的方法調用綁定到接口的實現,而不是類本身上普通的面向公共方法。

第三個幾乎總是改變行爲,因爲你得到了一個不同的類型(因此完全不同的對象)。

因爲我沒有太多具體的Office interop經驗,所以我不能說出你屬於哪一種情況,但是這應該回答你的基本問題:「這些情況怎麼會不同?

+0

感謝您的解釋。我刪除了投射操作,現在有:(Outlook.Items inboxFolder = oInbox.Items;)它編譯和運行就好,當我調用oInbox.Items排序它仍然無法排序,當我打電話排序在inboxFolder它確實排序正確。這很奇怪,如果我在Google – 2012-02-09 16:57:52

+0

@MikeItsMe上找不到答案,我從來不會想到爲排序創建額外的參考:在這種情況下,「Outlook.Items」或者是一個接口,它是由' oInbox.Items',該類型的父類,或者可以使用*隱式*轉換的類型。不過,你是對的,因爲它肯定是不直觀的,看起來是一個糟糕的設計選擇。 – 2012-02-09 17:10:41

+0

我注意到Items屬性被列爲只讀。這將解釋爲什麼我無法對它們進行分類。但在C#中是否有可能通過將基礎數據分配給新引用來規避只讀?或者也許.Items屬性在幕後做了一個克隆?感謝您繼續討論! – 2012-02-09 17:24:42

2

Outlook.Inbox-要創建一個新的參考現有收件箱中沒有創建一個新。因此,排序實際上是在現有收件箱中完成的。

+0

正是。但是,爲什麼排序工作在新參考上,而不是原始參考上?我可以理解,如果原始收件箱是隻讀的,並且需要將所有項目複製到新收藏集以進行修改,但正如您所述,正在現有收件箱中執行排序。 – 2012-02-09 16:28:21

+0

啊,錯過了。見@ AdamRobinson的答案。 – 2012-02-09 16:30:27