4

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)
    { }
}
4

2 に答える 2

5

通常、MissingMethodExceptionビルド中に参照したものとは異なるバージョンの dll をロードしていて、(実行時に) ロードしている実際の dll には、コンパイラが (コンパイル時に) 見つけたメソッドがないことを意味します。 .

さまざまなプロジェクトで参照されているさまざまなバージョンの dll を取得していないことを確認してください。デバッグ モードで実行すると、他のコードによって正しいdll が最初に読み込まれる可能性がありますが、コンテキスト内で実行すると、この他のコードが実行されないため、代わりに正しくないバージョンが読み込まれます。

失敗したメソッドが最近追加された場合、これは二重に適用されるため、参照されている古いバージョンには含まれていない可能性があります。

アセンブリの完全なバージョン管理を使用している場合は、デバッグ出力を見て、読み込まれるアセンブリを正確に確認できる場合があります。

于 2008-12-08T21:47:11.377 に答える
0

私はここで推測しています。

メソッドに制約を付けて、それが役立つかどうかを確認します Pseudocode

public static bool IsTypeOf(this T item, O other) Where T: object, O: Type { }

また、このメソッドはどのクラスにありますか?

編集:このクラスは、テストされているアセンブリの一部ですか?

于 2008-12-08T21:29:30.443 に答える