Re: Удобное получение имени свойства
От: Аноним  
Дата: 18.08.08 12:27
Оценка:
Здравствуйте, SiAVoL, Вы писали:

Предлагаю следующее решение, почти без затрат времени, и писанины меньше:
    class A3 : INotifyPropertyChanged
    {
        private int _myProperty;
        public int MyProperty
        {
            get { return _myProperty; }
            set
            {
                _myProperty = value;
                PropertyChanged.Fire(this);
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

    static class Utils
    {
        static System.Collections.Generic.Dictionary<Type, string> dict = new System.Collections.Generic.Dictionary<Type, string>();
        public static void Fire(this PropertyChangedEventHandler handler, INotifyPropertyChanged obj)
        {
            if (handler != null)
            {
                string propertyName;
                if (!dict.TryGetValue(obj.GetType(), out propertyName))
                {
                    dict[obj.GetType()] = propertyName =
                        (new System.Diagnostics.StackTrace()).GetFrame(1).GetMethod().Name.Substring(4);
                }
                handler(obj, new PropertyChangedEventArgs(propertyName));
            }
        }
    }


Вот мои результаты тестирования:
SiAVoL:   1,3459  adanov:   0,0544  old:   0,0398
SiAVoL:   1,3257  adanov:   0,0522  old:   0,0398
SiAVoL:   1,3192  adanov:   0,0521  old:   0,0394
SiAVoL:   1,3193  adanov:   0,0524  old:   0,0397
SiAVoL:   1,3163  adanov:   0,0518  old:   0,0395
SiAVoL:   1,3201  adanov:   0,0522  old:   0,0400
SiAVoL:   1,3174  adanov:   0,0530  old:   0,0397
SiAVoL:   1,3266  adanov:   0,0521  old:   0,0392
SiAVoL:   1,3245  adanov:   0,0522  old:   0,0395
SiAVoL:   1,3266  adanov:   0,0517  old:   0,0398

Получается чуть медленнее оригинального (но с пустыми обработчиками !!!!).
Но если свойство имеет тип System.Int32, результаты значительно отличаются:
SiAVoL:   1,2349  adanov:   0,0147  old:   0,0036
SiAVoL:   1,1984  adanov:   0,0122  old:   0,0031
SiAVoL:   1,1949  adanov:   0,0122  old:   0,0033
SiAVoL:   1,2124  adanov:   0,0119  old:   0,0031
SiAVoL:   1,2007  adanov:   0,0121  old:   0,0034
SiAVoL:   1,1924  adanov:   0,0119  old:   0,0031
SiAVoL:   1,1948  adanov:   0,0120  old:   0,0035
SiAVoL:   1,1947  adanov:   0,0122  old:   0,0031
SiAVoL:   1,1846  adanov:   0,0119  old:   0,0033
SiAVoL:   1,1842  adanov:   0,0120  old:   0,0031

т.е. улучшение в 100 раз при безопасном рефакторинге
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.