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 もスローします。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)
{ }
}