2012-06-27 7 views
19

私はclass Aと呼び出すことができるスーパークラスを持ち、いくつかのサブクラスを持っています。 class a1 : A,class a2 : A、...、a6 : A。私のclass Bでは、サブクラスの1つを作成してList<A>Bに追加する一連のメソッドがあります。C#オブジェクトを作成するobj = new T()?

私は自分のコードを短縮したいと思います。だからではなく、

Adda1() 
{ 
    aList.Add(new a1()); 
} 

Adda2() 
{ 
    aList.Add(new a2()); 
} 

... 

Adda6() 
{ 
    aList.Add(new a6()); 
} 

は、代わりに私がこの

Add<T>() 
{ 
    aList.Add(new T()); // This gives an error saying there is no class T. 
} 

に似た何かを書きたい書き込みのことは可能ですか?

TAまたはそのサブクラスの1つである必要がありますか?

+0

[ジェネリック型のインスタンスを作成しますか?](http://stackoverflow.com/questions/731452/create-instance-の可能重複ジェネリックタイプ) –

答えて

32

リーの答えは正しいです。また、あなたはタイプのあなたのオブジェクトを追加できるように制約T : Aが必要

void Add<T>() where T : new() 
{ 
    ... new T() ... 
} 

理由がためにあなたがあなたのタイプのパラメータにnew()制約を追加する必要がnew T()を呼び出すことができるようにするということですTList<A>

注:new()を他の制約と共に使用する場合、new()の制約はの最後のになる必要があります。

関連

+0

ありがとうございます。つまり、型制約としてクラスAを渡すことができます。 Aのサブクラスを制約として渡すことしかできない方法がありますか? – sehlstrom

+0

@sehlstrom:いいえ、実行時にテストして、誰かがA型のオブジェクトを渡した場合に例外をスローすることができます。 'A'抽象化を検討することもできます。 –

+0

Greate!だから 'A'が抽象的であれば、それを渡すことはできません。または私はそれを渡すことができますが、インスタンスを作成することはできませんか? – sehlstrom

26
public void Add<T>() where T : A, new() 
{ 
    aList.Add(new T()); 
} 
+0

詳細については、http:// msdnを参照してください。 Microsoft.com/ja-jp/library/twcad0zb – SirPentor

+0

ありがとうございました。 – idok

関連する問題