代码之家  ›  专栏  ›  技术社区  ›  Kjell Rilbe

两个具有相同AssemblyQualifiedName的不同类?

  •  0
  • Kjell Rilbe  · 技术社区  · 6 年前

    在MSTest项目中,我为一些测试声明了一个内部类。它在测试项目的命名空间中声明如下:

    namespace Körningar.Test.Hjälpklasser
    {
        internal interface ITestkörningParams { int Heltal { get; } string Text { get; } }
        internal class TestkörningParams : ITestkörningParams { public int Heltal { get; set; } public string Text { get; set; } }
        // ...
    }
    

    在一个测试方法中,我有一个这个类的实例 parms ,并遍历其属性以记录其值:

    // Create parms of type körningsparametrarKlass.
    object parms = paramhämtare.HämtaParametrar(args, körningsparametrarKlass);
    
    // Log the property values of the parms object.
    log.Info($"Körningsparametrar:\r\n"
        + string.Join("\r\n",
            körningsparametrarKlass.GetProperties()
            .Where(pi => pi.GetGetMethod() != null)
            .Select(pi
              => $"{pi.Name} = {Convert.ToString(pi.GetGetMethod().Invoke(parms, null))}")
        )
    );
    

    这行代码抛出 TargetException 有消息说对象与目标类型不匹配。

    方法 paramhämtare.HämtaParametrar 创建是从NSubstitute mock对象创建的,该对象执行以下操作:

    paramhämtareMock.HämtaParametrar(new string[] { }, null).ReturnsForAnyArgs(new TestkörningParams());
    

    我看不出parms对象对于从 körningsparametrarKlass ,它与为 反对。

    检查VS Watch窗口中的变量可以得到以下结果:

    Dump from VS 2017 Watch window

    如您所见,AssemblyQualifiedName与 帕姆斯 krningsparametrarKlass公司 == ,但我也用 körningsparametrarKlass.Equals(parms.GetType()) 同样的结果。还要注意,手表窗口中的所有行实际上都是最新的,即使有些是灰色的-我刷新了他们之前,采取的转储。

    这怎么可能发生,我该怎么解决?

    我还应该提到,只有当我在同一个解决方案中同时为这个测试项目和另一个测试项目运行测试时,这种情况才会发生。如果我只运行有问题的测试,或者运行包含它的整个测试项目,则没有例外。

    [编辑] 在我看来,当类型对象从 AssemblyQualifiedName 在测试组件内。这个类型的对象显然不同于 typeof(TheClass)

    1 回复  |  直到 6 年前
        1
  •  0
  •   Kjell Rilbe    6 年前

    我想我找到了问题的原因。

    我有两个测试程序集,我们调用它们 Test1 Test2 Ass1 Ass2 分别是。

    测试1 引用了 测试2 测试2 包含名为 TheClass .

    ,某些代码使用程序集限定名来获取 Type 对象表示 .

    问题是,在这个时候,有两个“版本” :中的那个 测试2 测试1 测试2 .

    类型 测试1 ,而引用 里面 显然代表了 .

    测试1 运行时的程序集 测试2