我正在做一堆奇怪的通用东西,包括做很多委托类型的转换,并且在大多数情况下它工作得很好。
但是,我遇到了我找不到原因的演员表失败。
这是我的方法,以及以下调试数据。
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() 返回的所有版本在第一个之后,都来自动态加载的程序集。
那么,为什么这个铸件到现在已经成功了数百次呢?