Мне очень давно не нравилось использование имен в виде строк в биндинге или, например, при реализации интерфейса INotifyPropertyChanged. Очень ненадежно и код так и норовит сломаться при рефакторинге. Вчера мне пришло в голову решение на основе Expression. Наверняка кто-то уже находил такое решение или даже использует его, потому что решение лежит на поверхности. Но мне такой подход до сих пор не попадался, поэтому надеюсь что кому-то мой пост будет интересен.
Итак приведу небольшой класс, глядя на который будет ясно что я имею в виду:
class A1 : INotifyPropertyChanged
{
private string _myProperty;
public string MyProperty
{
get { return _myProperty; }
set
{
_myProperty = value;
InvokePropertyChanged(() => MyProperty);
}
}
public event PropertyChangedEventHandler PropertyChanged;
private void InvokePropertyChanged<T>(Expression<Func<T>> property)
{
PropertyChangedEventHandler Handler = PropertyChanged;
if (Handler != null)
{
MemberExpression expression = (MemberExpression) property.Body;
Handler(this, new PropertyChangedEventArgs(expression.Member.Name));
}
}
}
При таком подходе можно быть спокойным во время рефакторинга.
Конечно же меня заинтересовало насколько просядет производительность при таком коде
new: 0,6813 old: 0,0260
new: 0,5975 old: 0,0253
new: 0,5897 old: 0,0264
new: 0,5876 old: 0,0262
new: 0,5902 old: 0,0264
new: 0,5923 old: 0,0261
new: 0,6267 old: 0,0254
new: 0,5844 old: 0,0252
new: 0,5796 old: 0,0265
new: 0,5840 old: 0,0260
Видно, что "новый" подход примерно в 20 раз медленнее классического. Но в принципе для любителей "не экономить на спичках", чем не вариант?

... << RSDN@Home 1.2.0 alpha 4 rev. 1096>>