Здравствуйте, 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 раз при безопасном рефакторинге