无法将命名空间 A.objectA 强制转换为命名空间 A.objectA

本文关键字:objectA 命名空间 转换 | 更新日期: 2023-09-27 18:35:10

我的应用程序的EndToEnd测试包括手动加载已发布的ll。

在测试期间,我总是加载以下内容:- n个调试程序集的NUnit卷影副本- n 个发布程序集的生成后事件副本

即使我确定这两个副本来自我的反射加载的同一构建生成(版本)转换也会失败。

为了提供一些上下文,这里有一些伪代码:

private HookingHelper globalhooker;
private Tools.ISomething globalmockery;

TestfixtureSetUp(){
    globalhooker = new globalhooker();
    globalhooker.Loadfrom("c:'postbuildcopy.dll");
    globalmockery = Mockrepository.Generate<Tools.ISomething>();
    globalhooker.SetViaReflection<Tools.ISomething>("nameofsomething", globalmockery);
 }

我有一个帮助程序类,它使用 Loadfrom 在程序集内获取静态。在我打电话之前,我必须注入一个模拟。

此模拟是使用调试版本中工具库的卷影副本创建的,因为 nunit 创建了它。

加载的库是发布版本,这对我来说很重要,因为我想尽可能接近真实环境进行测试。

当我尝试使用反射注入时,我必须使用FieldInfo SetValue(...)调用看起来像这样:

    public static void ReplaceFieldPublicStatic<T>(Type type, string fieldname, T obj)
    {
        FieldInfo field = AssemblyHelper.GetFieldInfoPublicStatic(type, fieldname);
        field.SetValue((T)obj, obj);
    }

反射索米西梅斯有效,有时我的类型不能相互铸造。

该错误是由 FieldInfo SetValue(...) 生成的参数异常。

当我不确定异常并调查field.FieldType != typeof(T)之间的差异时,只有 GetHashCode() 调用给出了不同的值。

我认为这涉及到一点随机性。

我可以强制类型转换吗?这甚至明智吗?

在构建我缺少的项目时,我需要做些什么吗?

无法将命名空间 A.objectA 强制转换为命名空间 A.objectA

即使我确定这两个副本来自我的反射加载的同一构建生成(版本)转换也会失败。

是的 - 如果两种类型来自两个不同的Assembly对象,则就 CLR 而言,它们是不同的类型。程序集可能已从完全相同的字节序列加载,但它们仍然是不同的程序集。

基本上,您需要为每种类型选择一个Assembly