私たちは使用するWebサービスフレームワークを持っています。私は作成に関与しておらず、修正する能力がありません。基本的には、クッキーカッターコードがフレームワークに「モジュール」を追加する必要があります。コードの形式のサンプルは以下のとおりです。なぜ私は名前の衝突を経験していますか
以下の例では、同じ名前の2つのクラスがあることを認識せずに、数ヶ月以下の各クラスにHelper
クラスを追加しました。コードは正常にコンパイルされますが、Webサーバーにデプロイされると実行時エラーが発生します。いずれかのProcessor_ProcessCompletedイベントハンドラがヒットした場合、タイプHelper
のオブジェクトをHelper
にキャストできないことを示す無効キャスト例外がスローされます。
私はこのエラーを理解してから、Helper
クラスを再調整して状況を改善しました。これらのヘルパークラスは、自分のクラスの外部では決して参照されません。プライベートな子クラスであり、異なる名前空間にあり、どちらの名前空間もどちらの名前空間も参照しません。私の質問は、なぜこの衝突が起こっているかです。
明らかに私は間違っていますが、彼らを親クラスに非公開かつ内部的に宣言するという単なる行為は、それらがすべての衝突の可能性から隔離されていると考えました。
namespace NameSpace1
{
public class Client1
{
Processor processor;
private class Helper
{
public Property1 { get; set; }
public Property2 { get; set; }
}
public Client1(Processor p)
{
processor = p;
processor.ProcessCompleted += Processor_ProcessCompleted;
}
void Processor_Process(object sender, ProcessCompletedEventArgs e)
{
Helper helper = (Helper)e.UserState;
// ... do a bunch of stuff
}
}
}
namespace NameSpace2
{
public class Client2
{
Processor processor;
private class Helper
{
public Property1 { get; set; }
}
public Client2(Processor p)
{
processor = p;
processor.ProcessCompleted += Processor_ProcessCompleted;
}
void Processor_Process(object sender, ProcessCompletedEventArgs e)
{
Helper helper = (Helper)e.UserState;
// ... do a bunch of stuff
}
}
}
日時ジョンスキート:ジョン、返信いただきありがとうございます。この場合、すべてのクライアントが同じプロセッサを使用します。それらのすべてはイベントハンドラをイベントに割り当てます。私はあなたが何を言っているのか理解していますが、キャストは特定のメソッドのコンテキストで行われるため、メソッドのコンテキストから特定のタイプを推測できるように見えます。
ヘルパーの割り当て先に関しては、プロセッサ自体は実際にEventArgsに何が入っているかを実際には見ません。プロセッサーにはちょうどobject
です。非同期呼び出しは次のようになります。
processor.Process(request, helper);
これはレスポンスでキャストしようとしているのと同じクラスの内部に発生します。ヘルパーには、サービスが実行パスを決定するために使用する単純なデータが含まれています。
Jonの編集に編集: Jon、私は今問題を見ると思う。フレームワークの設計者は、すべてのクライアントが同じプロセッサを使用できるように特別に設計しました。したがって、私はあなたが完全にすべての購読クライアントのために解雇されているイベントについて正しいと思います。実際、クライアントを使用している人は次のようなコードを書いています:
Processor processor = new Processor();
Client1 client1 = new Client1(processor);
Client2 client2 = new Client2(processor);
client1.ExecuteSomeRequest(); // calls processor.Process(request, helper);
client2.ExecuteSomeOtherRequest(); // calls processor.Process(request, helper);
私は勤勉で包括的な答えに感謝します。
Jonさん、ありがとうございます。私はもう少し情報を提供するために投稿を更新しました。 –