Удобное получение имени свойства
От: SiAVoL Россия  
Дата: 18.08.08 06:20
Оценка: 57 (8)
Мне очень давно не нравилось использование имен в виде строк в биндинге или, например, при реализации интерфейса 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>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.