Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class NotifyPropertyChanged : INotifyPropertyChanged
- {
- public event PropertyChangedEventHandler PropertyChanged;
- protected virtual void RaisePropertyChanged()
- {
- var frames = new StackTrace();
- for (var i = 0; i < frames.FrameCount; i++)
- {
- var frame = frames.GetFrame(i).GetMethod() as MethodInfo;
- if (frame != null)
- {
- if (frame.IsSpecialName && frame.Name.StartsWith("set_"))
- {
- RaisePropertyChanged(frame.Name.Substring(4));
- return;
- }
- }
- }
- throw new InvalidOperationException("NotifyPropertyChanged() can only by invoked within a property setter.");
- }
- protected void RaisePropertyChanged(string propertyName)
- {
- PropertyChangedEventHandler handler = this.PropertyChanged;
- if (handler != null)
- {
- handler(this, new PropertyChangedEventArgs(propertyName));
- }
- }
- }
- class Notifier : NotifyPropertyChanged
- {
- string _name1 = "";
- public string Name1
- {
- get
- {
- return _name1;
- }
- [MethodImpl(MethodImplOptions.NoInlining)]
- set
- {
- _name1 = value;
- RaisePropertyChanged();
- }
- }
- string _name2 = "";
- public string Name2
- {
- get
- {
- return _name2;
- }
- set
- {
- _name2 = value;
- RaisePropertyChanged("Name2");
- }
- }
- }
- public static void Main()
- {
- const int N = 1000;
- var x = new Notifier();
- Console.WriteLine("Verifying that this will even work...");
- PropertyChangedEventHandler handler = (sender, e) => { Console.WriteLine(e.PropertyName); };
- x.PropertyChanged += handler;
- x.Name1 = "Test Name1 value";
- x.Name2 = "Test Name2 value";
- x.PropertyChanged -= handler;
- Console.WriteLine("Done. Press Enter to begin.");
- Console.ReadLine();
- var sw = Stopwatch.StartNew();
- for (int i = 0; i < N; ++i)
- {
- x.Name1 = "Whatever";
- }
- sw.Stop();
- TimeSpan elapsed1 = sw.Elapsed;
- Console.WriteLine("Raised event using reflection {0} times in {1} ms.", N, elapsed1.TotalMilliseconds);
- sw = Stopwatch.StartNew();
- for (int i = 0; i < N; ++i)
- {
- x.Name2 = "Whatever";
- }
- sw.Stop();
- TimeSpan elapsed2 = sw.Elapsed;
- Console.WriteLine("Raised event WITHOUT reflection {0} times in {1} ms.", N, elapsed2.TotalMilliseconds);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement