无法将namespace.object强制转换为namespaceS.objectS

时间:2012-05-23 14:56:30

标签: c# reflection casting end-to-end

我的应用程序的EndToEnd测试包括手动加载releasells。

在测试期间,我总是加载以下内容: - n个调试程序集的NUnit shadowcopy - n发布程序集的Postbuildeventcopy

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

在这里给出一些上下文是一些伪代码:

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在程序集中获取静态。在我打电话之前我必须注射一个模拟器。

这个模拟是使用调试版本中工具库的shadowcopy创建的,因为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(...)生成的ArgumentException。

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

我认为有一点随机性。

我可以强制使用Typecast吗?这是明智的吗?

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

1 个答案:

答案 0 :(得分:0)

  

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

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

基本上,您需要选择一个 Assembly以用于每种类型。