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)}}

在运行时检查这些值表明它们看起来是相同的。指定的演员第一次工作,第二次失败。注意:这不是它被调用的次数导致它失败。在其他测试用例中,我向 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

代表分配基于签名,但演员表不是。因此,如果在第二种情况下 T 委托类型不同,则强制转换“失败”是预期的行为。

要转换委托类型,请使用这样的代码

编辑:在使用转换异常数据阅读您的编辑后,我敢打赌,您的代码以某种方式加载了持有 AIDECore.Controller 类型的程序集的多个不同版本 - 检查这些类型。

于 2012-08-15T07:21:22.693 回答