Скажем, у меня есть сторонний класс, который представляет собой модель данных. Он имеет около 100 свойств (некоторые с общедоступными сеттерами и геттерами, другие с общедоступными геттерами, но частными сеттерами). Назовем этот класс ContosoEmployeeModel
Я хочу добавить к этому классу интерфейс (INavigationItem, у которого есть свойства Name и DBID), чтобы его можно было использовать в моем приложении (это поставщик PowerShell, но сейчас это не важно). Однако его также необходимо использовать как ContosoEmployeeModel.
Моя первоначальная реализация выглядела так:
public class ContosoEmployeeModel
{
// Note this class is not under my control. I'm supplied
// an instance of it that I have to work with.
public DateTime EmployeeDateOfBirth { get; set; }
// and 99 other properties.
}
public class FacadedEmployeeModel : ContosoEmployeeModel, INavigationItem
{
private ContosoEmployeeModel model;
public FacadedEmployeeModel(ContosoEmployeeModel model)
{
this.model = model;
}
// INavigationItem properties
string INavigationItem.Name { get; set;}
int INavigationItem.DBID { get; set;}
// ContosoEmployeeModel properties
public DateTime EmployeeDateOfBirth
{
get { return this.model.EmployeeDateOfBirth; }
set { this.model.EmployeeDateOfBirth = value; }
}
// And now write 99 more properties that look like this :-(
}
Однако ясно, что это потребует написания огромного количества шаблонного кода для раскрытия всех свойств, и я бы предпочел этого избежать, если смогу. Я могу сгенерировать этот код в коде T4 в частичном классе, и сделаю это, если нет лучших идей, но я хотел бы попросить здесь посмотреть, есть ли у кого-нибудь лучшие идеи, используя некоторые super wizzy немного магии C #
Обратите внимание - API, который я использую для получения ContosoEmployeeModel, может возвращать только ContosoEmployeeModel - я не могу расширить его, чтобы вернуть FacededEmployeeModel, поэтому упаковка модели - единственное решение, которое я могу придумать - я рад, что меня исправят: )
ContosoEmployeeModel
И у вас естьContosoEmployeeModel
, встроенный в ваш фасад через композицию? Почему? - person Treb   schedule 02.07.2013object
кINavigationItem
, которое, если неnull
, используется вместоINavigationItem
, когда кто-то переходит к нему? - person dtb   schedule 02.07.2013