2009-07-23 8 views
4

型をとる汎用静的クラスを持つC#Webサービスで作業しています。変数を型に代入する、汎用静的クラスを持つ変数を使用する

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

それは、このエラーを与える:これはコンパイルされませんなぜ私が思っていた

The type or namespace name 'type1' could not be found (are you missing a using directive or an assembly reference?)

そして、私は、コードの2行目にtype1上にカーソルを移動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が私を台無しにしていることがわかりました。 ;)

+0

/私を甘やかす/悪いマナーを教えた/ ;-) – Thorarin

答えて

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); 
    } 
} 
3

汎用タイプは、コンパイル時にと評価され、ランタイムでは評価されません。実行時にはtype1とは決めることができないので、この構造体は使用できません。

type1はタイプではなく、タイプTypeの変数です(タイプStringのオブジェクトと同じように)。

+0

あなたはあなたが言ったことを入れ替えましたか?たぶん "汎用タイプは_compile time_ではなく_runtime_で評価されます。" –

+0

また、 'typeof'はコンパイルタイプでは' typeof(MySnazzyType) 'と書かれているので、なぜそれを判別できないのですか? –

+1

いいえ、彼は正しく書いています。あなたのケースの一般的な型は 'ConnectionPool_Accessor <>'です。これは実際にコンパイル時に解決されます。そしてその時点で、 'type1'がどのタイプに解決するかを知る方法がありません。基本的には、C#は静的に型指定された言語です。 –

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の動的型指定を使用しない限り、バットの大きな痛みになります。

関連する問題