Пример, когда не хватает анонимных классов

6yrop

тут была тем о том, что в C# не хватает анонимных классов, было высказано мнение, что они заменяются анонимными делегатам. Приведу простой пример. Надо прибайндить к выпадающем списку коллекцию объектов, хочется это сделать типизировано. Вот как это выглядит с анонимным классом

IEnumerable<Product> products = //получаем из базы список продуктов
new DropDownListBinder<Product>(dropDownList1,
new DropDownItemBinder<Product>
{
public override object GetText(Product data)
{
return data.Name;
}

public override object GetValue(Product data)
{
return data.Id;
}
}).SetData(products);

С анонимными делегатами можно, но криво :crazy:

timefim

С анонимными делегатами можно, но криво
new DropDownListBinder<Product>(..., x => new DropDownItemBinder(x.Name, x.Id
?

6yrop

new DropDownListBinder<Product>(..., x => new DropDownItemBinder(x.Name, x.Id
не то. Для каждого свойства должна быть своя функция, и у функции должно быть имя.

6yrop

new DropDownItemBinder(x.Name, x.Id
у тебя создается хранилище, а это лишнее, которое потом возможно будет мешать. Тредования такие: нужны две (в общем случае несколько) функции, объединенные некоторой конструкцией.

Dasar

вроде тоже самое:

IEnumerable<Product> products = //получаем из базы список продуктов
new DropDownListBinder<Product>(dropDownList1,
new DropDownItemBinder<Product>(data => data.Name, data => data.Id)
.SetData(products);

6yrop

IEnumerable<Product> products = //получаем из базы список продуктов
new DropDownListBinder<Product>(dropDownList1,
new DropDownItemBinder<Product>(data => data.Name, data => data.Id)
  .SetData(products);
да, это самый прямой вариант, но тут у методов нет имени, т.е. по клду не видно, что Name дайндится к тексту.
У меня еще есть вот такой вариант
new DropDownListBinder<Product>(dropDownList1).Text(data => data.Name).Value(data => data.Id)..SetData(products).
Правда тут есть минус — можно забыть один из методов, а в анонимном классе они абстрактные. Спасибо :), в синтаксисе 3.0 это симпатичнее смотрится, но мы пока на 2.0, а там тип параметра делегата надо явно указывать, Решарпер конечно генерит его, но громоздко смотрится.

6yrop

еще, простым списком параметров передавать делегаты не удобно, потому что часто требуется разный набор методов. Делать кучу перегруженных методов не круто, и их число в общем случае растет как 2^n от числа параметров. А в случае анонимного класса просто перегружаешь нужные виртуальные/абстрактные методы.
Так же нельзя вызывать базовый метод base.Metthod1

6yrop

но тут у методов нет имени
наверное, инициализаторы эту проблему решают...

agaaaa

В C# 3.0 вроде есть анонимные классы.

6yrop

В C# 3.0 вроде есть анонимные классы.
это просто совпадение термина

agaaaa

Я плохо понял постановку данной конкретной задачи или они её решают?
Если первое, напиши подробнее, плз, что есть и что надо получить.

Dasar

анонимный класс в C# 3.0 - это просто tuple<> с возможность изменения имен полей, а не только типов полей.
методы, наследования, реализацию интерфейсов в такой анонимный класс добавить нельзя.
и соответственно задачу из данного треда они не решают

timefim

у тебя создается хранилище, а это лишнее, которое потом возможно будет мешать.
Может оно конечно и лишнее, но за удобство приходится платить, а каждый раз рисовать такого анонимного крокодила, имхо это жесть.
Оставить комментарий
Имя или ник:
Комментарий: