Проблема конструктора C # при использовании обобщений - PullRequest
3 голосов
/ 26 мая 2010

Пожалуйста, посмотрите пример моего кода ниже:

КОД ОБНОВЛЕН

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

EDIT Исправления в объявлении конструктора сделаны! Тем не менее, проблема с этим кодом

Код не компилируется - в нем много странных мелких ошибок, заставляющих меня думать, что здесь проблема с дизайном?

Ответы [ 7 ]

4 голосов
/ 26 мая 2010

Как уже отмечали другие, вы должны отбросить ключевое слово void, однако оно по-прежнему неверно. Общее объявление должно быть в классе, а не в конструкторе

public class ScrollableCheckboxList<TModel>
  where TModel : class
{
  public ScrollableCheckboxList(...) 
  {
    // ...
  }
}
3 голосов
/ 26 мая 2010

Имя функции ScrollableCheckboxList совпадает с именем вашего класса.

Сама ошибка верна, ваш код - нет.

Вы хотите объявить конструктор, но добавив void перед именем конструктора, компилятор C # считает, что это функция. И функции не могут иметь того же имени, что и класс, в котором они живут (отсюда и ошибка).

Удалите void перед именем функции, тогда она станет конструктором.

И укажите ограничения TModel на уровне класса.

public /* void */ ScrollableCheckboxList /* <TModel> */(IEnumerable<TModel> items, string valueField, string textField, string titleField) /* where TModel : class */
2 голосов
/ 26 мая 2010

У вас не может быть конструктора, который принимает общие параметры. Вам нужно либо переместить универсальный параметр до уровня класса, либо сделать настройку элементов методом, который принимает универсальный параметр.

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 напрямую.

2 голосов
/ 26 мая 2010

ПРОБЛЕМА НАЙДЕНА

Конструктор не может объявлять общее определение TModel, объявление класса должно выполнять эту работу

, например

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

    public ScrollableCheckboxList(IEnumerable<TModel> items, string valueField, string textField, string titleField)
    { 
        ...
0 голосов
/ 26 мая 2010

Конструктор должен быть

public ScrollableCheckboxList<TModel>

вместо

public void ScrollableCheckboxList<TModel>

Другими словами, отбросьте пустоту.

0 голосов
/ 26 мая 2010

Это не конструктор, чтобы быть конструктором, вы должны удалить «пустую» клавиатуру.

0 голосов
/ 26 мая 2010

Вы не объявили конструктор. В конструкторе нет ключевого слова void:

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

Тип не может содержать методы с тем же именем, что и тип.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...