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

3
请看下面我代码的示例:

代码已更新

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个回答

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 */

我已经更新了上面的代码,但它仍无法编译,我不明白为什么(编译器也没有给出明确的错误信息!) - Jimbo
好的,找到问题了,类声明必须定义泛型对象TModel,而不是构造函数。感谢您的输入。 - Jimbo

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

这应该可以正常工作,虽然我也建议您不要直接暴露列表成员变量。


0
你没有声明构造函数。构造函数中没有 void 关键字:
public ScrollableCheckboxList<TModel>(IEnumerable<TModel> items, string valueField, string textField, string titleField) where TModel : class {}

一个类型不能包含与该类型同名的方法。


0

构造函数必须是

public ScrollableCheckboxList<TModel>

而不是

public void ScrollableCheckboxList<TModel>

换句话说,去掉 void。

0

这不是一个构造函数,要成为构造函数,您必须删除 "void" 关键字。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接