Чтобы ваш второй фрагмент кода работал, NotifyPropertyChangedWrapper
непременно должен использовать отражение (или dynamic
) для генерации класса, который предоставляет интерфейс, совместимый с Customer
и реализующий автоматическое уведомление свойства.Не должно быть никаких проблем с привязкой данных, но будут небольшие накладные расходы.
Упрощенная реализация, использующая динамический объект, может выглядеть примерно так:
public class NotifyPropertyChangedWrapper<T>
: DynamicObject, INotifyPropertyChanged
{
private T _obj;
public NotifyPropertyChangedWrapper(T obj)
{
_obj = obj;
}
public override bool TryGetMember(
GetMemberBinder binder, out object result)
{
result = typeof(T).GetProperty(binder.Name).GetValue(_obj);
return true;
}
// If you try to set a value of a property that is
// not defined in the class, this method is called.
public override bool TrySetMember(
SetMemberBinder binder, object value)
{
typeof(T).GetProperty(binder.Name).SetValue(_obj, value);
OnPropertyChanged(binder.Name);
return true;
}
// Implement OnPropertyChanged...
}
Очевидно, что любойкод, который потребляет один из этих объектов, потерял бы любой статический тип безопасности.Другой вариант - создать класс, реализующий тот же интерфейс, что и оборачиваемый класс.Есть много примеров для этого в Интернете.Основным требованием является то, что ваш Customer
должен быть либо interface
, либо все его свойства должны быть виртуальными.