2011-10-28 3 views
0

背景:私のウェブサイトでは、サードパーティのHTTPモジュールがHttpRuntimeキャッシュにオブジェクトのコレクションを作成しています。私のWebアプリケーションプロジェクトでは、キャッシュ内のこれらのオブジェクトを調べて、特定のプロパティ値を持つオブジェクトが見つかった場合にさまざまなアクションを実行する必要があります。サードパーティのDLLからオブジェクトをローカルクラスのオブジェクトにキャストする方法が必要です

私はキャッシュコレクションをループして、各オブジェクトをローカルクラスのインスタンスにキャストしようとしています(サードパーティクラスの設計と同じです)。

(私は第三者アセンブリへの参照を作成することができますが、アセンブリがインストールされていない可能性があるので、より堅牢なメソッドを作成しようとしています)。

ただし、キャストは機能しません。 ASP.NETは元のオブジェクトが別のアセンブリから発生していることを認識しています。これは例外である:

[A] 3rdParty.HttpModule.CachedRequestは [B] 3rdParty.HttpModule.CachedRequestにキャストすることはできません。タイプAは、 'C:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \'のコンテキストで 'Default'というコンテキストで 'ThirdParty.HttpModule、Version = 3.6.0.0、Culture = neutral、 PublicKeyToken = null'テンポラリASP.NET ファイル\ルート\ 61910352 \ 63f5dc4f \アセンブリ\ dl3 \ 710995cc \ 37f36a76_71e5cb01 \ 3rdParty.HttpModule.dll '。 タイプBはコンテキスト 'Default' at に 'MyCompany.MyWebsite、Version = 1.4.0.1396, Culture = neutral、PublicKeyToken = null'という名前の場所 'C:\ WINDOWS \ Microsoft.NET \ Framework \ v4.0.30319 \ Temporary ASP.NET Files \ root \ 61910352 \ 63f5dc4f \ assembly \ dl3 \ 8bfb9ba0 \ 0c053836_8595cc01 \ MyCompany.MyWebsite.DLL '。

私がする必要があるのは、オブジェクトの1文字列プロパティの値をチェックすることだけです。これを行うための(簡単な)方法がいくつかありますか?オブジェクトを文字列にシリアル化して文字列を解析することもOKです。

おかげ

答えて

3

.NETは強い型付けされたので、いや、あなたは異なったタイプのものにオブジェクトをキャストすることはできません - メモリレイアウトが同一であることを起こる場合でも、.NETは、彼らが知っています他の種類。

アセンブリのコンパイルタイプの参照を持たないオブジェクトのプロパティを読み取るには、Reflectionまたはdynamicのいずれかを使用する必要があります。おそらくより簡単です。dynamic

dynamic theObject = // get the object from the cache 
DoSomethingWith(theObject.TheProperty); 
+0

パーフェクト。この(動的な)正確に私が必要と実装するのは簡単です。ありがとう! – Laurence

1

アプリケーションでこのような手順を繰り返す必要がある場合は、Mapperを使用することをおすすめします。

AutoMapperあなたが望むことをするでしょう。

オブジェクトの変数の内容を別のオブジェクトの変数にコピーします(変数名は一致する必要があります)。
これで、完全に編集可能なオブジェクト(インターフェイス、継承などを追加する)で作業し、その後、元のサードパーティオブジェクトに戻すことができます。

関連する問題