C#:无法将类型A转换为类型B,其中A = B。

3

我目前从InvalidCastException中获得这个错误。

[A]System.Data.Objects.ObjectResult`1[EDMXAssembly.ServiceStatus] cannot be cast to 
[B]System.Data.Objects.ObjectResult`1[EDMXAssembly.ServiceStatus]. 
Type A originates from 'System.Data.Entity, Version=4.0.0.0, Culture=neutral, 
PublicKeyToken=b77a5c561934e089' in the context 'Default' at location 
'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.Entity\v4.0_4.0.0.0__b77a5c561934e089\System.Data.Entity.dll'. 
Type B originates from 'System.Data.Entity, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' in the 
context 'Default' at location 'C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.Entity\v4.0_4.0.0.0__b77a5c561934e089\System.Data.Entity.dll'.

长得很丑!

我正在使用反射在运行时加载的程序集中调用一个方法。我要调用的方法返回 ObjectResult<T>。当我尝试将调用结果转换为该类型时,出现错误。

我认为这是由于运行时加载的程序集包含对 System.Data.Entity 的引用,以及进行反射和转换的程序集;因为这些是两个不同的引用,所以类型被视为不同。(我这么说是否正确?)

有没有解决此问题的方法?我要调用的方法在一个 ObjectContext 上,所以我不能改变它的返回值。

谢谢。

编辑代码段:

public QueryResultSet<T> ObjectQuery<T>(string dataContext, string functionName, List<ObjectParameter> functionParameters)
{
    var context = htContexts[dataContext];
    ObjectResult<T> qResult = (ObjectResult<T>)context.GetType().InvokeMember(functionName, BindingFlags.InvokeMethod, null, context, functionParameters.ToArray());

    return qResult;
}

错误发生在qResult行上(我只是快速模拟这个,因此没有try-catch)。

4
请展示你调用该方法的代码片段。 - IAbstract
3
我很确定你的分析是正确的;来自装配的两个不同负载的类型被认为是不同的类型。 - dlev
我认为您在分析上是正确的,这可能是因为程序集被加载到不同的加载上下文中(即Load和LoadFrom上下文)。我建议尝试使用融合日志查看器以获取增强的程序集解决信息。请注意,问题可能出现在此处:EDMXAssembly.ServiceStatus。 - Just another metaprogrammer
融合日志查看器(http://msdn.microsoft.com/zh-cn/library/e74a18c4(v=VS.100).aspx) - Just another metaprogrammer
我正在使用 Assembly.LoadFrom 在运行时加载程序集。这本身可能会有问题吗?在调用中,EDMXAssemvly.ServiceStatus 是我传递的通用 T - Andy Hunt
显示剩余3条评论
1个回答

1

这是一个很好的例子,说明为什么需要将接口放在一个公共的、独立的库中。你需要使用一个接口来处理 ObjectResult。这样,你的 ObjectResult 就可以在其他程序集之间拥有一个公共的契约。

编辑
如果你无法对源代码中的 ObjectResult 进行任何继承,那么你可能需要对返回的对象进行更多的反射操作,以便将其转换为你的 ObjectResult。警告:这可能是一种代价高昂的转换...

...或者重构以得到另一个解决方案。


在这种情况下,我该如何为ObjectResult创建一个接口?我无法更改ObjectContext返回的内容。理论上,ObjectResult不是应该成为程序集之间的通用契约吗?但这里有两个对它的引用。 - Andy Hunt
如果您在一个程序集中有一个 ObjectResult,它与另一个程序集中的 ObjectResult 不相等。 - IAbstract
我注意到了。所以这真的没有什么办法吗?重构时间,也许? - Andy Hunt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接