2012-01-09 4 views
3

I以下リサイズクラス有する:ジェネリックコンストラクタ:T entity = new T();

class EntityEditorForm<T>: System.Windows.Forms.Form 
           where T: ICloneable<T> {} 

class EntityCollectionEditorForm<T> : System.Windows.Forms.Form 
             where T: ICloneable<T> {} 

最初のフォームクラスはT.

第二のタイプに応じて実行時にコントロールを作成するためのエディタ<T>マネージャがためであります<T>のコレクションで、追加、編集、削除の各機能を備えています。コレクションは、リストビューコントロールに表示され、カスタム属性を使用してリフレクションによってフィールドが設定されます。

追加および編集ボタンのコードは次のようになります。

private void buttonEdit_Click (object sender, System.EventArgs e) 
{ 
    T entity = default(T); 
    entity = (T) this.listView.SelectedItems[0].Tag; 
    new EntityEditor<T>(entity).ShowDialog(this); 
} 

private void buttonEdit_Click (object sender, System.EventArgs e) 
{ 
    T entity = new T(); //This is the code which is causing issues 
    entity = (T) this.listView.SelectedItems[0].Tag; 
    new EntityEditor<T>(entity).ShowDialog(this); 
} 

編集の場合default(T)作品が、私は追加シナリオとのトラブルを抱えています。 T entity = new T();は合法ではないようです。

+0

明らかに、同じwhere句内に複数の制約を追加する方法はわかりませんでした。宣言を 'クラスEntityCollectionEditorForm < T >に変更します。System.Windows.Forms.Form T:ICloneable < T >、new(){}'が動作しました。 –

+0

私は記事を読んできましたが、制約を把握することはできません。どんなレイ・マンの説明も感謝されるだろう:)。 –

答えて

6

型にパラメータのないコンストラクタが含まれている場合、このパラメータのないコンストラクタを使用してインスタンス化できるように、汎用型Tに制約を追加できます。 Constraints on Type Parameters

where T : new() 

MSDNの記事:これを行うには、制約を追加します。

+2

"空のコンストラクタ"は実際には "パラメータのないコンストラクタ"でなければなりません。そうでなければ、コードを持たないように見えます。 –

+0

@JonSkeet良い点 - 私は私の答えを訂正しました。 –

+0

@ Slade、ありがとう。私は質問を終えていたので、私は答えを見つけましたが、これは間違いなく時間が節約されたでしょう。制約に慣れていないことを考えると、これは十分な人にはおそらく有用でしょう。 –