使用 Visual Studio 2008 / C# / VS 单元测试。
我有一个非常简单的扩展方法,它会告诉我对象是否属于特定类型:
public static bool IsTypeOf<T, O>(this T item, O other)
{
if (!(item.GetType() is O))
return false;
else
return true;
}
它会被称为:
Hashtable myHash = new Hashtable();
bool out = myHash.IsTypeOf(typeof(Hashtable));
当我在调试模式下运行代码或调试单元测试时,该方法工作得很好。然而,在我刚刚在上下文中运行所有单元测试的那一刻,我神秘地得到了这个方法的 MissingMethodException。奇怪的是,同一个类中的另一个扩展方法没有问题。
我倾向于问题不是扩展方法本身。我试过删除临时文件,关闭/重新打开/清理/重建解决方案等。到目前为止,没有任何效果。
有没有人在任何地方遇到过这种情况?
编辑:这是代码的简化示例。基本上,这是我能够在没有周围代码包袱的情况下创建的最小的可重现示例。当放入单元测试时,这个单独的方法也会单独抛出 MissingMethodException,就像上面一样。有问题的代码并没有完成手头的任务,就像乔恩提到的那样,它更多的是我目前关注的异常的来源。
解决方案:我尝试了许多不同的方法,同意 Marc 将其视为参考问题的思路。删除引用、清理/重建、重新启动 Visual Studio 不起作用。最终,我最终在我的硬盘驱动器中搜索已编译的 DLL,并将其从任何没有意义的地方删除。删除除 TestResults 文件夹中的所有实例后,我就能够成功地重建并重新运行单元测试。
至于方法的内容,我是在单元测试中发现问题的,但始终无法让这个概念发挥作用。由于 O 是一个 RunTimeType,我似乎没有太多访问它的权限,并尝试使用 IsAssignableFrom() 来让函数正确返回。目前,此功能已从我的验证方法中删除,以便下次重新访问。但是,在删除它之前,我仍然遇到了用许多其他方法开始这篇文章的原始问题。
后解决方案:实际的方法并不像我想象的那么复杂。这是实际的工作方法:
public static void IsTypeOf<T>(this T item, Type type)
{
if (!(type.IsAssignableFrom(item.GetType())))
throw new ArgumentException("Invalid object type");
}
和单元测试来验证它:
[TestMethod]
public void IsTypeOfTest()
{
Hashtable myTable = new Hashtable();
myTable.IsTypeOf(typeof(Hashtable));
try
{
myTable.IsTypeOf(typeof(System.String));
Assert.Fail("Type comparison should fail.");
}
catch (ArgumentException)
{ }
}