Здравствуйте, kirill_kgz, Вы писали:
_FR>>А вы можете показать, для чего в классе формы нужно знать именно тип Customer и почему не достаточно одного интерфейса
_FR>>Из примера этого не понять.
_>Чтобы мы могли при сохранении данных и их отображении на форме обращаться на прямую к свойствам, которые есть только у класса.
В том-то и дело: fParent-у знать про Customer ни разу не обязательно: детали нужны только уже в fCustomer. Поэтому я бы сделал как-то так (вообще, код кажется очень не правильным, но это лучше обсуждать в Архитектуре: сейчас же только о замене дженериков):
public partial class fParent : Form
{
protected virtual IEntity ItemCore { get; }
protected virtual void SaveData()
{
ItemCore.Save();
}
protected DialogResult EditItemCore(bool showModal)
{
this.FillElements();
this.ApplySecuritySettings();
if (showModal)
return this.ShowDialog();
else
{
this.MdiParent = UIManager.MDIForm;
this.Show();
return DialogResult.OK;
}
}
}
public partial class fCustomer : fParent <Customer>
{
private Customer Item { get; set; }
protected override IEntity ItemCore { get { return Item; } }
public DialogResult EditItem(Customer item, bool showModal)
{
Item = item;
return EditItemCore(showModal);
}
}
В чём цимес: fParent ничего не знает про конкретные IEntity, и только конкретная формула знает, с чем работает. Но при этом не нужно тянуть за собой дженерик-параметры в иерархии (а где-то ещё какой параметр понадобится? а кому-то надо будет обобщённо работать с fParent и ему придётся знать/получать тип entity).
В данном случае вы используете дженерики исключительно для генерации кода (по сути — двух свойств в fCustomer в моём примере (хранящего данные Item и предоставляющего их для базы ItemCore)). Для кодогенерации, если она действительна нужна, лучше использовать специально заточенные средства: можно или создать шаблон страницы или, если первого способа не достаточно, прикрутить T4.
_>Напишите пожалуйста пример, когда будет достаточно только интерфейса для отображения данных, и как их в этом случае отображать на форме
Для обобращения конкретные типы, вообще говоря, не нужны: используйте биндинг. В вашем же примере конкретики в базе и так нету, она в наследниках.