View difference between Paste ID: MbHjxhRy and
SHOW:
|
|
- or go back to the newest paste.
1 | - | |
1 | + | class NotifyPropertyChanged : INotifyPropertyChanged |
2 | { | |
3 | public event PropertyChangedEventHandler PropertyChanged; | |
4 | ||
5 | protected virtual void RaisePropertyChanged() | |
6 | { | |
7 | var frames = new StackTrace(); | |
8 | for (var i = 0; i < frames.FrameCount; i++) | |
9 | { | |
10 | var frame = frames.GetFrame(i).GetMethod() as MethodInfo; | |
11 | if (frame != null) | |
12 | { | |
13 | if (frame.IsSpecialName && frame.Name.StartsWith("set_")) | |
14 | { | |
15 | RaisePropertyChanged(frame.Name.Substring(4)); | |
16 | return; | |
17 | } | |
18 | } | |
19 | } | |
20 | throw new InvalidOperationException("NotifyPropertyChanged() can only by invoked within a property setter."); | |
21 | } | |
22 | ||
23 | protected void RaisePropertyChanged(string propertyName) | |
24 | { | |
25 | PropertyChangedEventHandler handler = this.PropertyChanged; | |
26 | if (handler != null) | |
27 | { | |
28 | handler(this, new PropertyChangedEventArgs(propertyName)); | |
29 | } | |
30 | } | |
31 | } | |
32 | ||
33 | class Notifier : NotifyPropertyChanged | |
34 | { | |
35 | string _name1 = ""; | |
36 | public string Name1 | |
37 | { | |
38 | get | |
39 | { | |
40 | return _name1; | |
41 | } | |
42 | [MethodImpl(MethodImplOptions.NoInlining)] | |
43 | set | |
44 | { | |
45 | _name1 = value; | |
46 | RaisePropertyChanged(); | |
47 | } | |
48 | } | |
49 | ||
50 | string _name2 = ""; | |
51 | public string Name2 | |
52 | { | |
53 | get | |
54 | { | |
55 | return _name2; | |
56 | } | |
57 | set | |
58 | { | |
59 | _name2 = value; | |
60 | RaisePropertyChanged("Name2"); | |
61 | } | |
62 | } | |
63 | } | |
64 | ||
65 | public static void Main() | |
66 | { | |
67 | const int N = 1000; | |
68 | ||
69 | var x = new Notifier(); | |
70 | ||
71 | Console.WriteLine("Verifying that this will even work..."); | |
72 | ||
73 | PropertyChangedEventHandler handler = (sender, e) => { Console.WriteLine(e.PropertyName); }; | |
74 | x.PropertyChanged += handler; | |
75 | ||
76 | x.Name1 = "Test Name1 value"; | |
77 | x.Name2 = "Test Name2 value"; | |
78 | ||
79 | x.PropertyChanged -= handler; | |
80 | ||
81 | Console.WriteLine("Done. Press Enter to begin."); | |
82 | Console.ReadLine(); | |
83 | ||
84 | var sw = Stopwatch.StartNew(); | |
85 | for (int i = 0; i < N; ++i) | |
86 | { | |
87 | x.Name1 = "Whatever"; | |
88 | } | |
89 | sw.Stop(); | |
90 | ||
91 | TimeSpan elapsed1 = sw.Elapsed; | |
92 | ||
93 | Console.WriteLine("Raised event using reflection {0} times in {1} ms.", N, elapsed1.TotalMilliseconds); | |
94 | ||
95 | sw = Stopwatch.StartNew(); | |
96 | for (int i = 0; i < N; ++i) | |
97 | { | |
98 | x.Name2 = "Whatever"; | |
99 | } | |
100 | sw.Stop(); | |
101 | ||
102 | TimeSpan elapsed2 = sw.Elapsed; | |
103 | ||
104 | Console.WriteLine("Raised event WITHOUT reflection {0} times in {1} ms.", N, elapsed2.TotalMilliseconds); | |
105 | } |