4

私は、型を取る汎用静的クラスを使用して C# Web サービスで作業しています。なぜこれがコンパイルされないのか疑問に思っていました:

Type type1 = typeof(MySnazzyType);
Assert.AreEqual(0, ConnectionPool_Accessor<type1>._pool.Count);

次のエラーが発生します。

型または名前空間名 'type1' が見つかりませんでした (using ディレクティブまたはアセンブリ参照がありませんか?)

type1そして、コードの 2 行目にカーソルを合わせると、ReSharper に「タイプまたは名前空間名が必要です」と表示されます。まあ、タイプですtype1 型の変数ですType! 私がそうしてもうまくいきません:

Type type1 = typeof(MySnazzyType);
Assert.AreEqual(0, ConnectionPool_Accessor<typeof(type1)>._pool.Count);

私は自分の型をいくつかの異なる変数に割り当て、毎回Type入力するのではなく、それらをさまざまな汎用静的クラスのテストに使用することを望んでいました。MySnazzyType任意のアイデア、または私はやることにこだわっています:

Assert.AreEqual(0, ConnectionPool_Accessor<MySnazzyType>._pool.Count);

編集:明確にするために、ジェネリッククラスでMySnazzyTypeなく、ジェネリッククラスから継承しません。ここで唯一のジェネリック クラスはConnectionPool_Accessor.

Pavel のコメント「本質的に、あなたの問題は C# が静的に型付けされた言語であるということです」のおかげで、私は Ruby が私を甘やかしてきたことを今知っています。;)

4

3 に答える 3

3

ジェネリック型は、実行時ではなく、コンパイル時に評価ます。実行時に何になるかを決定できないため、この構成は許可されていません。type1

これは実際にはResharperが言っていることです:type1タイプではなく、タイプの変数ですType(タイプのオブジェクトである可能性があるのと同じようにString)。

于 2009-07-23T21:40:14.227 に答える
3

まず第一に、ReSharperは実際には正しいです。これはではなく、変数です。確かに、それは型に対応する反射オブジェクトを保持している変数ですが、それだけでは十分ではありません。

<...>括弧の間に、他の識別子の名前ではなく、型の名前を記述する必要があります。

ただし、リフレクションを介してジェネリックオブジェクトを構築し、静的オブジェクトであってもそのプロパティにアクセスできるため、コードを書き直してそれを行うことができるはずですが、NUnit 2.5を見たことがありますか?

最新のリリースノートから、単体テストクラスは汎用になり、テストするタイプをテストクラスの属性で指定できるようになりました。

これにより、次のような記述が可能になります(注、これはテストしていません。ドキュメントで新しい属性の名前を調べただけです)。

[TestFixture(typeof(MySnazzyType))]
[TestFixture(typeof(MyOtherSnazzyType))]
public class Tests<T>
{
    [Test]
    public void PoolCount_IsZero()
    {
        Assert.AreEqual(0, ConnectionPool_Accessor<T>._pool.Count);
    }
}
于 2009-07-23T21:41:46.563 に答える
1

属性で設定するTestFixture必要がありますが、念のため: 実行時にこれらすべてを実行したい場合は、リフレクションを使用して実行できます。

Type poolType = typeof(ConnectionPool_Accessor<>);
Type snazzyType = typeof(MySnazzyType); // Or however you want to get the appropriate Type
poolType.MakeGenericType(snazzyType);

次に、リフレクションを使用して、必要なことを何でも行うことができますpoolType。もちろん、C# 4.0 の動的型付けを使用しない限り、これは大きな苦痛となります。

于 2009-07-23T22:13:10.977 に答える