2011-08-17 88 views
3

我目前从InvalidCastExceptionC#:无法A型转换为B型,其中A = B

[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>。当我尝试将调用的结果强制转换为该错误时,会出现该错误。

我认为这是由于运行时加载assmebly包含一个对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)的occurrs

+4

向我们展示您调用方法的代码片段。 – IAbstract

+3

我很确定你的分析是正确的;来自装配的两种不同载荷的类型被认为是不同的类型。 – dlev

+0

您是否尝试过使用var关键字并访问类属性? var foo = myClass.results(); –

回答

1

这是一个很好的例子,说明为什么你需要将接口保存在一个通用的独立库中。您需要使用ObjectResult的接口。这样,你的ObjectResult可以在你的其他程序集之间有一个公共约定。

编辑
如果您不能继承任何应用到源ObjectResult您可能必须在对象上进行更多的思考返回以转换ObjectResult。警告:这可能是一个昂贵的转换...

...或重构派生另一种解决方案。

+0

在这种情况下,我将如何为'ObjectResult'制作一个接口?我无法改变ObjectContext返回的内容。理论上,'ObjectResult'不会是程序集之间的通用契约吗?但在这里有两处引用。 – AndyBursh

+0

如果在一个程序集中有一个“ObjectResult”,它不等于另一个程序集中的ObjectResult。 – IAbstract

+0

我注意到了。那真的没有办法解决这个问题了吗?重构时间,也许? – AndyBursh

相关问题