使用泛型时的C#构造函数问题

时间:2010-05-26 08:38:28

标签: c# generics constructor types

请参阅下面的代码示例:

CODE UPDATED

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

修改 对构造函数声明的更正!虽然这个代码仍然存在问题

代码不会编译 - 它会产生许多奇怪的小错误,让我觉得这里有设计问题?

7 个答案:

答案 0 :(得分:4)

正如其他人指出的那样,您应该删除void关键字,但它仍然不正确。泛型声明应该在类上,而不是构造函数

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

答案 1 :(得分:3)

函数ScrollableCheckboxList的名称与您的类名相同。

错误本身是正确的,您的代码不是。

你想声明一个构造函数,但是通过在构造函数名称之前添加void,C#编译器认为它是一个函数。函数不能与它们所在的类同名(因此错误)。

因此,在函数名称前面删除void,然后它将是一个构造函数。

并在班级指定TModel约束。

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

答案 2 :(得分:2)

发现问题

构造函数可能不会声明通用的TModel定义,类声明必须执行该作业

e.g。

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

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

答案 3 :(得分: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成员变量。

答案 4 :(得分:0)

您没有声明构造函数。构造函数中没有void个关键字:

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

类型不能包含与类型名称相同的方法。

答案 5 :(得分:0)

它不是构造函数,要成为构造函数,你要删除“void”关键字。

答案 6 :(得分:0)

构造函数必须是

public ScrollableCheckboxList<TModel>

而不是

public void ScrollableCheckboxList<TModel>

换句话说,放弃虚空。