2012-01-09 138 views
3

我有以下的WinForms類:通用構造函數: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>並具有添加,編輯和刪除功能。該集合顯示在listview控件中,並使用自定義屬性通過反射填充字段。

用於添加和編輯按鈕的代碼如下所示:

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 >,新的(){}'工作。 – 2012-01-09 09:41:54

+0

我一直在閱讀文章,但似乎無法理解約束條件。任何臥鋪解釋將不勝感激:)。 – 2012-01-09 09:43:37

回答

6

如果您的種類中,包括參數的構造函數,你可以添加一個約束到您的泛型類型T允許實例通過這個參數的構造函數。爲此,請添加約束條件:

where T : new() 

MSDN Article on Constraints on Type Parameters

+2

需要注意的是「空構造函數」應該真正做到「參數的構造函數」 - 否則它聽起來像它有沒有代碼。 – 2012-01-09 09:45:32

+0

@JonSkeet好點 - 我糾正了我的答案。 – 2012-01-09 09:46:35

+0

@謝謝,謝謝。當我完成這個問題時,我偶然發現了答案,但如果沒有發生,這肯定會節省時間。鑑於我對約束的不熟悉,這可能對足夠多的人有用。 – 2012-01-09 12:57:55

相關問題