Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
单元测试中的C#扩展方法异常_C#_.net_Unit Testing_Exception_Extension Methods - Fatal编程技术网

单元测试中的C#扩展方法异常

单元测试中的C#扩展方法异常,c#,.net,unit-testing,exception,extension-methods,C#,.net,Unit Testing,Exception,Extension Methods,使用VisualStudio2008/C#/VS单元测试 我有一个非常简单的扩展方法,可以告诉我对象是否属于特定类型: public static bool IsTypeOf<T, O>(this T item, O other) { if (!(item.GetType() is O)) return false; else return true; } 在调试模式下运行代码或调试单元测试时,该方法工作正常。然而,在我刚刚在上下文中

使用VisualStudio2008/C#/VS单元测试

我有一个非常简单的扩展方法,可以告诉我对象是否属于特定类型:

public static bool IsTypeOf<T, O>(this T item, O other)
{
    if (!(item.GetType() is O))
        return false;
    else
        return true;
}
在调试模式下运行代码或调试单元测试时,该方法工作正常。然而,在我刚刚在上下文中运行所有单元测试的那一刻,我神秘地得到了该方法的MissingMethodException。奇怪的是,同一类中的另一个扩展方法没有问题

我倾向于问题不是扩展方法本身。我尝试过删除临时文件、关闭/重新打开/清理/重建解决方案等。到目前为止,没有任何效果

有人在任何地方遇到过这种情况吗

编辑:这是一个简化的代码示例。基本上,这是我能够创建的最小的可复制示例,而不需要周围代码的包袱。当放入单元测试时,这个单独的方法也会单独抛出MissingMethodException,如上所述。所讨论的代码并没有完成手头的任务,正如Jon所提到的,它更像是我目前关心的异常的来源

解决方案:我尝试了许多不同的方法,同意马克的思路,认为这是一个参考问题。删除引用、清理/重建、重新启动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)
    { }
}
我在这里猜测

对该方法施加约束,看看这是否有帮助

伪码

公共静态bool IsTypeOf(此T项,O其他),其中T:object,O:Type { }

还有,这个方法在哪个类中


编辑:该类是正在测试的程序集的一部分吗?

通常,
MissingMethodException
表示您正在加载与生成过程中引用的不同版本的dll,并且您正在加载的实际dll(在运行时)没有编译器找到的方法(在编译时)

检查您是否没有以某种方式获得不同项目引用的dll的不同版本。可能是在调试模式下运行时,其他一些代码会首先加载正确的dll,但在上下文中运行时,其他这些代码不会运行,因此会加载不正确的版本

如果最近添加了失败的方法,则这将加倍适用,因此可能不在引用的旧版本中


如果您使用的是完整的程序集版本控制,您可能能够查看调试输出,以准确查看加载的程序集。

示例代码不起作用-哈希表是一种类型,而不是可以传入的表达式。请你再看看你的问题好吗?一个简短但完整的例子会有所帮助。上面的例子是文字例子吗?如果是这样的话,试着换成别的什么?@约翰。固定的。错过了typeof()。现在将编译该示例,但它不会执行您想要的操作。它总是返回true,因为GetType()总是返回一个类型。除此之外,为什么不从“bool out=myHash is Hashtable”开始呢?我无法使复合约束起作用。它会导致语法错误。我会继续摆弄它。它所在的类在application.Marc的根程序集中称为“ObjectValidationExtensions”,这很有意义。我将尝试创建一个新项目,并将类拉入其中,因为通过手动检查,引用似乎很好。我会让你知道结果如何。最终,它不知何故从其他地方从汇编的编译版本中获取了一个引用,尽管它被添加为项目引用。谢谢你的帮助!
[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)
    { }
}