Сегодня я натолкнулся на интересный метод реализации интерфейса INotifyPropertyChanged. Вместо передачи строкового имени измененного свойства или лямбда-выражения мы можем просто вызвать RaisePropertyChanged (); из установщика отметьте, что вызов не имеет параметров. Это код метода RaisePropertyChanged ():
public virtual void RaisePropertyChanged()
{
var frames = new System.Diagnostics.StackTrace();
for (var i = 0; i < frames.FrameCount; i++)
{
var frame = frames.GetFrame(i).GetMethod() as MethodInfo;
if (frame != null)
if (frame.IsSpecialName && frame.Name.StartsWith("set_"))
{
RaisePropertyChanged(frame.Name.Substring(4));
return;
}
}
throw new InvalidOperationException("NotifyPropertyChanged() can only by invoked within a property setter.");
}
И это свойство, которое будет уведомлять своих иждивенцев о своем изменении:
public string MyProperty
{
get { return _myField; }
set
{
_myField= value;
RaisePropertyChanged();
}
}
Хотя мне этот подход интересен, Я думаю, что снижение производительности может быть серьезным, если свойство часто меняется ... или если каждое свойство в нашем приложении использует этот подход для уведомления о своем изменении.
Я хотел бы услышать ваше мнение. (флажка community-wiki больше нет?) Будет ли этот подход очень неэффективным?