无法将命名空间 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() 调用给出了不同的值。
我认为这涉及到一点随机性。
我可以强制类型转换吗?这甚至明智吗?
在构建我缺少的项目时,我需要做些什么吗?
即使我确定这两个副本来自我的反射加载的同一构建生成(版本)转换也会失败。
是的 - 如果两种类型来自两个不同的Assembly
对象,则就 CLR 而言,它们是不同的类型。程序集可能已从完全相同的字节序列加载,但它们仍然是不同的程序集。
基本上,您需要为每种类型选择一个Assembly
。