4

私は C# と Office オートメーションに比較的慣れていませんが、最近、誰かの Outlook 受信トレイへの参照を取得しようとして、受信時刻で電子メールを並べ替えようとしていることに気付きました。受信トレイが Microsoft.Office.Interop.Outlook.Items 型のローカル変数に割り当てられ、ローカル変数で並べ替えが実行され、機能するソリューションを Web 上の他の場所で見つけるまで、機能しませんでした。しかし、問題はなぜですか?C# ではオブジェクトは参照であり、新しい Outlook.Inbox 参照を宣言してユーザーの受信トレイからアイテムを割り当てると、実際の電子メールへの追加のポインターとして機能し、実際には各電子メールをコピーしません。新しいコレクションに。つまり、元の参照で Sort を呼び出すのと同じはずですよね? 明らかに私は間違っているので、私は' 説明をいただければ幸いです。サンクス!!

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!
4

2 に答える 2

6

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

  • Xの継承階層内にありますY(の親クラスYまたはの子クラスのいずれかであることを意味しますY)。が親クラスの場合X、キャストは、問題のオブジェクトが実際 Y(またはから派生した型Y)である場合にのみ実行時に成功します。
  • Yによって実装されるインターフェイスタイプですX
  • Xからに定義された明示的な変換がありますY

ポリモーフィズムのため、最初のケースでのキャストは通常​​、関数の動作を変更しません(ただし、より派生した型が親の実装を明示的に非表示にする場合は変更できます)。しかし、私の疑いは、これがあなたのシナリオであるということです。の型は、の実装をoInbox.Items継承するが非表示にする型です。親タイプに明示的にキャストすることで、新しい子の実装をバイパスします。この種の手法は、子が仮想関数をオーバーライドするのではなく、関数を非表示Outlook.ItemsOutlook.Items.Sortにする場合にのみ機能することに注意してください) 。

X2番目のケースでは、使用する予定の関数を明示的に実装すると、動作が変わる可能性がYあります。インターフェイスにキャストすることで、クラス自体の通常の公開メソッドではなく、メソッド呼び出しをインターフェイスの実装にバインドするようにコンパイラに明示的に指示します。

3つ目は、ほとんどの場合、動作を変更します。これは、まったく異なるタイプ(したがって完全に異なるオブジェクト)を取得しているためです。

特にOfficeの相互運用の経験が少ないため、これらのケースのどれに該当するかはわかりませんが、これは「これらはどのように異なるのか」という基本的な質問に答えるはずです。

于 2012-02-09T16:27:07.463 に答える
2

新しいOutlook.Inbox を作成しているのではなく、既存の受信トレイへの新しい参照を作成しています。したがって、並べ替えは実​​際には既存の受信トレイで行われます。

于 2012-02-09T16:22:26.427 に答える