Postharp जैसी किसी चीज़ का उपयोग किए बिना, मेरे द्वारा उपयोग किया जाने वाला न्यूनतम संस्करण कुछ इस तरह का उपयोग करता है:
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
आपको बताता है कि अगर यह एक नहीं सेशन था, मामले में आप अन्य तर्क लागू करना चाहते हैं।
या 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);
}