2012-02-09 15 views
4

私は比較的新しいC#とOfficeオートメーションに慣れていますが、最近私は自分自身が誰かのOutlookの受信トレイへの参照を取得し、受信した時間で電子メールをソートしようとしています。 InboxがMicrosoft.Office.Interop.Outlook.Items型のローカル変数に割り当てられているソートがローカル変数で実行され、それが動作するWeb上の他の場所で解決策が見つかるまでは機能しませんでした。しかし、その理由は何ですか?私は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

答えて

6

キャストを実行しています((Outlook.Items)oInbox.Itemsを実行しています)。キャストとは、タイプXのオブジェクトをタイプYとして参照していることを意味します。これは、次のようなシナリオで有効です。

  • Xは、(それがYの親クラスまたはYの子クラスのどちらかだという意味)Yの継承階層内にあります。問題のオブジェクトが実際にY(またはYから派生型)であればXは、親クラスである場合には、キャストが実行時にのみ成功します
  • YX
  • によって実装されるインターフェイスタイプです
  • thoug(は通常は、機能の動作を変更しない最初のケースでは、鋳造、そのため多型のY

からXから定義された明示的な変換がありますより多くの派生型が親の実装を明示的に隠す場合には可能です)。 しかし私の疑惑は、あなたのシナリオです。タイプoInbox.Itemsは、Outlook.Itemsを継承するが、実装はOutlook.Items.Sortである。親の型に明示的にキャストすると、新しい子の実装をバイパスします。この種の技法は、子供が仮想関数をオーバーライドするのではなくを隠す場合にのみ有効です)

Xが、使用する予定のYの機能を明示的に実装している場合、2番目のケースで動作が変更される可能性があります。インターフェイスにキャストすることによって、クラス自体の通常の公開側のメソッドではなく、インターフェイスの実装にメソッド呼び出しをバインドするようコンパイラに明示的に伝えます。

3つ目のタイプは動作が変わります。異なるタイプ(したがって全く異なるオブジェクト)が得られているためです。

私はOffice interopの経験が豊富ではないので、これらのケースのどれに該当するのかについては言えませんが、「これはどう違うのですか」という基本的な質問に答える必要があります。

+0

説明をありがとう。私はキャスト操作を削除し、今持っている:(Outlook.Items inboxFolder = oInbox.Items;)それはコンパイルし、ちょうど良い実行し、私はソートをoInbox.Itemsでソートを呼び出すときにまだソートに失敗し、私は本当にinboxFolder正しく並べ替えます。これは非常に奇妙で、私はソートのための追加リファレンスを作成することは考えていませんでした。私はGoogleで答えを見つけませんでした –

+0

@MikeItsMe:その場合、 'Outlook.Items'は' oInbox.Items'、その型の親クラス、または使用可能な暗黙の*変換がある型のいずれかです。あなたは正しいですが、それは確かに直感的ではなく、設計上の選択肢が悪いようです。 –

+0

Itemsプロパティが読み取り専用としてリストされていることに気付きました。それは私がそれらを並べ替えることができない理由を説明します。しかし、C#では、基礎となるデータを新しい参照に割り当てることで読み取り専用を回避できますか?または、おそらく.Itemsプロパティは、背後にクローンをしていますか?ディスカッションを続行してくれてありがとう! –

2

あなたは既存受信トレイに新しい参照を作成しているOutlook.Inbox- 新しいを作成していません。したがって、ソートは実際には既存の受信トレイ上で実行されます。

+0

正確です。しかし、ソートはなぜ新しいリファレンスで動作しますが、元のリファレンスでは動作しませんか?元の受信トレイが読み取り専用で、変更するためにすべてのアイテムを新しいコレクションにコピーする必要がある場合は理解できますが、指定したように、並べ替えは既存の受信トレイで実行されています。 –

+0

ああ、それを逃した。 @ AdamRobinsonの答えを見てください。 –