เวอร์ชันที่เล็กที่สุดที่ฉันใช้จะไม่ใช้อะไรอย่าง Postsharp:
public class Data : INotifyPropertyChanged
{
// boiler-plate
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
protected bool SetField<T>(ref T field, T value, string propertyName)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
// props
private string name;
public string Name
{
get { return name; }
set { SetField(ref name, value, "Name"); }
}
}
สถานที่ให้บริการแต่ละคนเป็นเพียงสิ่งที่ชอบ:
private string name;
public string Name
{
get { return name; }
set { SetField(ref name, value, "Name"); }
}
ซึ่งไม่ใหญ่มาก มันสามารถใช้เป็นคลาสพื้นฐานได้หากคุณต้องการ bool
กลับมาจากการSetField
บอกคุณว่ามันเป็นไม่มี-op ในกรณีที่คุณต้องการที่จะใช้ตรรกะอื่น ๆ
หรือง่ายยิ่งขึ้นด้วย C # 5:
protected bool SetField<T>(ref T field, T value,
[CallerMemberName] string propertyName = null)
{...}
ซึ่งสามารถเรียกเช่นนี้:
set { SetField(ref name, value); }
ซึ่งคอมไพเลอร์จะเพิ่ม"Name"
โดยอัตโนมัติ
C # 6.0 ทำให้การใช้งานง่ายขึ้น:
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
... และตอนนี้ด้วย C # 7:
protected void OnPropertyChanged(string propertyName)
=> PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
protected bool SetField<T>(ref T field, T value,[CallerMemberName] string propertyName = null)
{
if (EqualityComparer<T>.Default.Equals(field, value)) return false;
field = value;
OnPropertyChanged(propertyName);
return true;
}
private string name;
public string Name
{
get => name;
set => SetField(ref name, value);
}