-1

以下はどのようにして「無効なキャスト例外」を生成できますか???

foreach (KeyValuePair<String,Object> entry in HttpRuntime.Cache)
{
    if (entry.Value.GetType() == typeof(MyClass))
    {
        MyClass mc = (MyClass)entry.Value; // ===> Invalid Cast Exception !!!

(なぜこれをやりたいのかと尋ねている人へ:キャッシュ内/キャッシュからいくつかの異なるオブジェクトをランダムに追加および削除するので、この種のテストが必要です。さまざまなオブジェクト; このオブジェクトのみをキャッシュにプッシュしますが、疑問が残ります: キャスト例外を解決しますか?)

4

3 に答える 3

1

動的 (再) コンパイルを行う環境にいますか? たとえば、ASP.NET Web サイトは、コード ファイルが変更された場合、実行時にページを再コンパイルします。そのページをアセンブリにコンパイルし、そのアセンブリを読み込みます。ランタイムがある時点で古いアセンブリをアンロードしても、古いアセンブリと互換性のない新しい型が得られます。

ある種のバージョン管理または厳密な命名でこれを回避できるかどうかはわかりません。しかし、変更が発生したため、古いタイプが必要になる可能性は低いと思われます。

于 2012-05-22T09:07:33.467 に答える
0

コードが失敗する理由はわかりませんが、「ソフトキャスト」でこれを試すことができます:

foreach (KeyValuePair<String,Object> entry in HttpRuntime.Cache) 
{ 
     MyClass mc = entry.Value as MyClass;
     if (mc != null)     
     {         
          //Do your stuff
于 2012-05-22T09:09:41.020 に答える
0

やっとできました。

まず最初に、申し訳ありませんが、ログ ファイルを読み間違えていました。例外は発生しませんでした

MyClass mc = (MyClass)entry.Value;

しかし、から

foreach (KeyValuePair<String,Object> entry in HttpRuntime.Cache)

Cache は KeyValuePair (インターネットで見つけたコード...) で反復処理できないようです。繰り返しになりますが、間違った方向に検索して時間を無駄にしてしまい申し訳ありません...とにかく助けてくれてありがとう!

そして今、動作するコードのために:

IDictionaryEnumerator CacheEnum = HttpRuntime.Cache.GetEnumerator();
    while (CacheEnum.MoveNext()) {
        MyClass mc = ((DictionaryEntry)CacheEnum.Current).Value as MyClass;
        if (mc != null) {
            // Doing stuff...
于 2012-05-22T19:03:58.433 に答える