0

私は、デリゲート型の多くのキャストを行うことを含む、奇妙な一般的なことをたくさん行っていますが、ほとんどの場合、それは完全に機能しています。
ただし、理由が見つからないキャストの失敗が発生しています。
これが私の方法であり、次のデバッグデータです。

    public static T GetInvokableDelegate<T>(string name) where T : class
    {
        return DelRegistry[name].GetSelectedMethod() as T;
        //DelRegistry[name].GetSelectedMethod() returns System.Object, 
        //which may be any flavor of Func<> or Action<>
    }
    //These two pairs represent the values from the Debug view, 
      //of T and GetSelectedMethod() respectively

    //This is when DelRegistry is returning the initial result from GetSelectedMethod():  This cast As T works fine.

    //System.Action<string,AIDECore.Controller>   
    //{Method = {Void HAL_TestMethod(System.String, AIDECore.Controller)}}    

    //This is after the second call,  GetSelectedMethod() is returning a different delegate, but with identical signature:  This one fails

    //System.Action<string,AIDECore.Controller>
    //{Method = {Void HAL_TestMethod(System.String, AIDECore.Controller)}}

実行時に値を調べると、それらが同一であるように見えます。指定されたキャストは、最初は機能しますが、2 回目は失敗します。注: 呼び出されて失敗した回数ではありません。他のテスト ケースでは、何十ものデリゲート バージョンを問題なく DelRegistry に追加しました。

私の質問は、「As」キャストが失敗する理由に関するエラー出力を取得できますか? (失敗とは null を返すことを意味します)

キャスト例外データ:

[A]System.Action`2[System.String,AIDECore.Controller] cannot be cast to [B]System.Action`2[System.String,AIDECore.Controller].
Type A originates from 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' in the context 'LoadNeither' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'.
Type B originates from 'mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' in the context 'LoadNeither' at location 'C:\Windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'.

つまり、基本的にはキャストできないと言います。

記録として、最初のバージョン以降の GetSelectedMethod() から返されるすべてのバージョンは、動的に読み込まれたアセンブリからのものです。

では、なぜこのキャスティングが今まで何百回もうまく機能してきたのでしょうか?

4

1 に答える 1

1

デリゲートの割り当ては署名に基づいていますが、キャストはそうではありません。したがって、2番目のケースでTデリゲートタイプが異なる場合、キャストの「失敗」は予想される動作です。

デリゲート型を変換するには、次のようなコードを使用します

編集:キャスト例外データを使用して編集を読んだ後、コードが AIDECore.Controller タイプを保持するアセンブリの複数の異なるバージョンを何らかの形でロードすることは間違いありません-それらのタイプを確認してください。

于 2012-08-15T07:21:22.693 に答える