2009-11-02 20 views
6

यह कुछ ऐसा है जो मैं सोच रहा था क्योंकि मैं गुणों पर सीख रहा था और मैं इनोटिफ़ाईप्रोपर्टी का उपयोग कर रहा था, बहुत अधिक था, सिर्फ और आइडिया है और मैं इसके बारे में कुछ समझना चाहता हूं। (मुझे पता है इसके लिए कंपाइलर पर कुछ काम की आवश्यकता होगी, न कि cosumer पक्ष पर)गुणों का उपयोग ... INotifyPropertyChanged

चूंकि इनोटिफ़ाईप्रॉपर्टी चेंज का उपयोग उसी पैटर्न के साथ ज्यादातर समय के साथ किया जाता है .. बस उस विधि को कॉल करने की तरह जो संपत्ति के नाम से घटना को आग लगती है, क्या इसे ऑटो-प्रॉपर्टीज के रूप में डिजाइन और विशेषता के रूप में डिज़ाइन किया जा सकता है? ताकि संकलक जानता है कि इसे PropertyChanged ईवेंट में कॉल जोड़ने की आवश्यकता है? तो अगर हम वर्ग ....

public class DemoCustomer : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private void NotifyPropertyChanged(String info) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(info)); 
     } 
    } 

    private string companyNameValue = String.Empty; 
     ... 
} 

के बजाय घोषित संपत्ति

public string CompanyName 
    { 
     get 
     { 
      return this.companyNameValue; 
     } 

     set 
     { 
         if (value != this.companyNameValue) 
         { 
          this.companyNameValue = value; 
          NotifyPropertyChanged("CompanyName"); 
         } 
     } 
    } 

हम कुछ इस तरह कर सकता है अगर हम इस विशेषता के आधार पर संकलक को इंगित कर सकते हैं कि यह करने की जरूरत है संपत्ति के नाम के साथ PropertyChanged के लिए एक कॉल उत्पन्न करता है, तो नया मान हम अभी भी टी में कोडिंग रख सकता है पिछले

[NotifyPropertyChanged] 
public string CompanyName 
{ 
    get;set; 
} 

से अलग है विशेषता का उपयोग नहीं करते समय कुछ कस्टम व्यवहार के लिए वह पुराना तरीका ..

उत्तर

8

आप do this कर सकते हैं पर Jason Bock के Dimecast देख सकते हैं, लेकिन मैं किसी भी समय जल्दी ही नहीं लगता कि यह कोर संकलक में हो जाएगा।

4

सोच की इस शैली को आस्पेक्ट ओरिएंटेड प्रोग्रामिंग (या एओपी) कहा जाता है। आप उस गुण के साथ संपत्तियों के माध्यम से जाने और उचित व्यवहार के साथ नई संकलित असेंबली को थूकने के लिए मोनो के सेसिल का उपयोग करके पोस्ट बिल्ड एक्शन जोड़कर अंतिम परिणाम प्राप्त कर सकते हैं। आप PostSharp के साथ "Leveraging Cecil to inject code into your Assemblies"

+0

बहुत अच्छी पढ़ाई .. बहुत बहुत धन्यवाद ... मैंने पोस्टशर्प का उपयोग करना शुरू कर दिया ... यही कारण है कि मैं दूसरे जवाब को इंगित कर रहा हूं। लेकिन यह भी उपयोगी है। – jmayor

7

यदि कोई इस धागे में होता है और सी # 5 (वीएस 2012+, .NET 4.5+) का उपयोग कर रहा है। यह मामला अब CallerMemberNameAttribute के साथ "अधिक आसानी से" किया जा सकता है। यह विशेषता एक स्ट्रिंग पैरामीटर पर लागू होती है और संकलक विधि/प्रॉपर्टी के नाम पर कंपाइलर को पास करने का कारण बनती है जब हमारे द्वारा उपयोग किए जाने वाले डिफ़ॉल्ट मान (यानी जब और तर्क पारित नहीं होता है)। कार्यान्वित करना INotifyPropertyChanged कम थकाऊ बनाना। उदाहरण के लिए:

public class MyClass 
{ 
    private string myProperty; 

    public string MyProperty 
    { 
     get { return myProperty; } 
     set 
     { 
      myProperty = value; 
      OnPropertyChanged(); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 

    protected void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     var handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

तो, तुम सिर्फ OnPropertyChanged() प्रत्येक सेटर में आवश्यकता घटना भेजने के लिए और संपत्ति नाम के लिए एक हार्ड-कोडेड स्ट्रिंग से निपटने के लिए नहीं है।

संबंधित मुद्दे