public async Task Test1() { var test2 = new TestMyPropertyChanged2Impl(); var proxy2 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged2)test2); /**/ var test1 = new TestMyPropertyChanged1Impl(); var proxy1 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged1)test1); //var proxyProxy1 = MyNotifyPropertyChangedImpl.GetProxy(proxy1); using (proxy1.PropertyChangedSubject.ObserveOn(TaskPoolScheduler.Default).Subscribe(i => { _output.WriteLine( $"proxy1 {i.PropertyName} changed {(i.InnerArgs as MyNotifyPropertyChangedArgs).With(_ => _ == null ? "" : _.PropertyName)}" ); })) { _output.WriteLine("----------0"); proxy1.P1 = 10; _output.WriteLine("----------1"); proxy1.P3 = test2; _output.WriteLine("----------2"); using (proxy2.PropertyChangedSubject.ObserveOn(TaskPoolScheduler.Default).Subscribe(i => { _output.WriteLine(string.Format("proxy2 {0} changed", i.PropertyName)); })) { proxy1.P3.P1 = 150; _output.WriteLine("----------3"); proxy1.P3 = proxy2; _output.WriteLine("----------4"); proxy2.P1 = 200; _output.WriteLine("----------5"); proxy2.P1 = 10; _output.WriteLine("----------6"); } } } [Fact] public async Task TestSerialization() { var test2 = new TestMyPropertyChanged2Impl(); var proxy2 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged2)test2); /**/ var test1 = new TestMyPropertyChanged1Impl(); var proxy1 = MyNotifyPropertyChangedImpl.GetProxy((ITestMyPropertyChanged1)test1); proxy1.P3 = proxy2;