using System.ComponentModel;
using System.Runtime.CompilerServices;
public class Program {
public static void Main() {
var x = new Test();
x.Foo = 10;
}
}
public class Test: INotifyPropertyChanged {
private int foo;
public int Foo { get => foo; set => this.Set(ref foo, value, PropertyChanged); }
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name) {
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(name));
}
}
public static class Extensions {
public static void Set<T>(
this INotifyPropertyChanged source, ref T property, T value, PropertyChangedEventHandler handler, [CallerMemberName]string propertyName = "") {
property = value;
handler?.Invoke(source, new PropertyChangedEventArgs(propertyName));
}
}
//https://pt.stackoverflow.com/q/347780/101
dXNpbmcgU3lzdGVtLkNvbXBvbmVudE1vZGVsOwp1c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwoKcHVibGljIGNsYXNzIFByb2dyYW0gewoJcHVibGljIHN0YXRpYyB2b2lkIE1haW4oKSB7CgkJdmFyIHggPSBuZXcgVGVzdCgpOwoJCXguRm9vID0gMTA7Cgl9Cn0KcHVibGljIGNsYXNzIFRlc3Q6IElOb3RpZnlQcm9wZXJ0eUNoYW5nZWQgewogICAgcHJpdmF0ZSBpbnQgZm9vOwogICAgcHVibGljIGludCBGb28geyBnZXQgPT4gZm9vOyBzZXQgPT4gdGhpcy5TZXQocmVmIGZvbywgdmFsdWUsIFByb3BlcnR5Q2hhbmdlZCk7IH0KCXB1YmxpYyBldmVudCBQcm9wZXJ0eUNoYW5nZWRFdmVudEhhbmRsZXIgUHJvcGVydHlDaGFuZ2VkOwoJcHJvdGVjdGVkIHZvaWQgT25Qcm9wZXJ0eUNoYW5nZWQoc3RyaW5nIG5hbWUpIHsKCQlQcm9wZXJ0eUNoYW5nZWRFdmVudEhhbmRsZXIgaGFuZGxlciA9IFByb3BlcnR5Q2hhbmdlZDsKCQlpZiAoaGFuZGxlciAhPSBudWxsKSBoYW5kbGVyKHRoaXMsIG5ldyBQcm9wZXJ0eUNoYW5nZWRFdmVudEFyZ3MobmFtZSkpOwoJfQp9CgpwdWJsaWMgc3RhdGljIGNsYXNzIEV4dGVuc2lvbnMgewogICAgcHVibGljIHN0YXRpYyB2b2lkIFNldDxUPigKICAgICAgICB0aGlzIElOb3RpZnlQcm9wZXJ0eUNoYW5nZWQgc291cmNlLCByZWYgVCBwcm9wZXJ0eSwgVCB2YWx1ZSwgUHJvcGVydHlDaGFuZ2VkRXZlbnRIYW5kbGVyIGhhbmRsZXIsIFtDYWxsZXJNZW1iZXJOYW1lXXN0cmluZyBwcm9wZXJ0eU5hbWUgPSAiIikgewogICAgICAgIHByb3BlcnR5ID0gdmFsdWU7CiAgICAgICAgaGFuZGxlcj8uSW52b2tlKHNvdXJjZSwgbmV3IFByb3BlcnR5Q2hhbmdlZEV2ZW50QXJncyhwcm9wZXJ0eU5hbWUpKTsKICAgIH0KfQoKLy9odHRwczovL3B0LnN0YWNrb3ZlcmZsb3cuY29tL3EvMzQ3NzgwLzEwMQ==