2010-05-26 14 views
3

時,請參閱下面我的代碼示例:C#構造函數問題使用泛型

CODE修訂

public class ScrollableCheckboxList 
{ 
    public List<ScrollableCheckboxItem> listitems; 

    public ScrollableCheckboxList<TModel>(IEnumerable<TModel> items, string valueField, string textField, string titleField) where TModel : class 
    { 
     listitems = new List<ScrollableCheckboxItem>(); 
     foreach (TModel item in items) 
     { 
      Type t = typeof(TModel); 
      PropertyInfo[] props = new [] { t.GetProperty(textField), t.GetProperty(valueField), t.GetProperty(titleField) }; 
      listitems.Add(new ScrollableCheckboxItem 
      { 
       text = props[0].GetValue(item, null).ToString(), 
       value = props[1].GetValue(item, null).ToString(), 
       title = props[2].GetValue(item, null).ToString() 
      }); 
     } 
    } 
} 

編輯 更正構造函數聲明訂做!這個代碼仍然存在問題

該代碼不會編譯 - 它出現了很多奇怪的小錯誤,讓我覺得這裏有一個設計問題?

回答

4

正如其他人指出,你應該刪除void關鍵字,但它仍然是不正確的。通用的聲明應該在類,而不是構造

public class ScrollableCheckboxList<TModel> 
    where TModel : class 
{ 
    public ScrollableCheckboxList(...) 
    { 
    // ... 
    } 
} 
3

函數ScrollableCheckboxList的名稱與您的類名相同。

錯誤本身是正確的,您的代碼不是。

你想聲明一個構造函數,但是通過在構造函數的名字之前加入void,C#編譯器認爲它是一個函數。並且函數不能和​​它們所在類相同(因此錯誤)。

所以刪除void在函數名的前面,那麼它將是一個構造函數。

並在類級別指定TModel約束。

public /* void */ ScrollableCheckboxList /* <TModel> */(IEnumerable<TModel> items, string valueField, string textField, string titleField) /* where TModel : class */ 
+0

一個愚蠢的疏忽!感謝您指出了這一點。 – Jimbo 2010-05-26 08:46:00

+0

我已經更新了上面的代碼,它仍然不會編譯,我不明白爲什麼(從編譯器沒有明確的錯誤!) – Jimbo 2010-05-26 08:51:49

+0

好吧,發現問題,類聲明必須定義通用對象TModel,而不是構造函數。感謝您的輸入。 – Jimbo 2010-05-26 08:57:40

0

你沒有聲明構造。有沒有void關鍵字在構造函數中:

public ScrollableCheckboxList<TModel>(IEnumerable<TModel> items, string valueField, string textField, string titleField) where TModel : class {} 

A型不能包含具有相同的名稱作爲該類型的方法。

0

這不是一個構造函數,要成爲一個構造函數,你必須刪除「void」關鍵字。

0

的構造必須是

public ScrollableCheckboxList<TModel> 

而非

public void ScrollableCheckboxList<TModel> 

換句話說,丟棄該空隙。

2

發現問題

構造可能不會宣佈通用的TModel定義,類聲明必須做的工作

例如

public class ScrollableCheckboxList<TModel> where TModel : class 
{ 
    public List<ScrollableCheckboxItem> listitems; 

    public ScrollableCheckboxList(IEnumerable<TModel> items, string valueField, string textField, string titleField) 
    { 
     ... 
2

你不能有一個構造函數,它需要泛型參數。您需要將通用參數移至類級別,或者將項目設置爲採用通用參數的方法。

public class ScrollableCheckboxList<TModel> 
    where TModel : class 
{ 
    public List<ScrollableCheckboxItem> listitems; 

    public ScrollableCheckboxList(IEnumerable<TModel> items, string valueField, string textField, string titleField) 
    { 
     listitems = new List<ScrollableCheckboxItem>(); 
     foreach (TModel item in items) 
     { 
      Type t = typeof(TModel); 
      PropertyInfo[] props = new [] { t.GetProperty(textField), t.GetProperty(valueField), t.GetProperty(titleField) }; 
      listitems.Add(new ScrollableCheckboxItem 
      { 
       text = props[0].GetValue(item, null).ToString(), 
       value = props[1].GetValue(item, null).ToString(), 
       title = props[2].GetValue(item, null).ToString() 
      }); 
     } 
    } 
} 

這應該可以正常工作,儘管我也建議您不要直接公開List成員變量。