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

时间:2011-08-17 14:10:29

标签: c# types

我目前从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行(我现在只是很快嘲笑这个,因此缺乏试用)

1 个答案:

答案 0 :(得分:1)

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

修改
如果您无法将任何继承应用于源ObjectResult,则可能必须对返回的对象执行更多反射,以便转换为ObjectResult。警告:这可能是一次代价高昂的转换......

......或重构以获得另一种解决方案。