2012-10-19 18 views
6

पर एक विस्तार विधि जोड़ना हम अपने दृश्य मॉडल में INotifyPropertyChanged कार्यान्वयन का बहुत कुछ कर रहे हैं और स्पष्ट रूप से संपत्ति को आग लगने के थक गए हैं, असुविधा और सौंदर्य दोनों कारणों से हमारे कोड में स्पष्ट रूप से घटनाओं को बदल दिया है।संपत्ति एक्सेसर

मैं अपने संपत्ति के सेटर पर एक विस्तार डाल करने के लिए, की तरह है, जिसके परिणामस्वरूप कोड देखो बनाने हैं:

public string LazyAccessor 
{ 
    get; 
    set.notify(); 
} 

वहाँ यह करने के लिए कोई तरीका है? यदि कोई नहीं है तो क्या हम एक आविष्कार कर सकते हैं?

उत्तर

3

पहलू उन्मुख प्रोग्रामिंग आपकी समस्या का समाधान हो सकती है।

Aspect Oriented Programming in C# देखें। और कुछ यहाँ उदाहरण: http://www.codeproject.com/Articles/337564/Aspect-Oriented-Programming-Using-Csharp-and-PostS

आपका "set.notify()" कुछ प्रतिबिंब के साथ काम कर सकता है, लेकिन मुझे लगता है कि यह अच्छा समाधान हो जाएगा नहीं है और आप अभी भी गेटर और सेटर को लागू करने की आवश्यकता होगी।

3

Extension methods केवल प्रकार में जोड़ा जा सकता है। स्वचालित गुणों पर गेटर्स और सेटर्स को संकलक द्वारा समर्थित चर के साथ विधियों में परिवर्तित कर दिया गया है, इसलिए उन पर एक विस्तार विधि डालने का कोई तरीका नहीं है।

2

क्या ऐसा करने का कोई तरीका है?

नहीं, ऐसा नहीं है, जैसा आपने पोस्ट नहीं किया है। विस्तार विधियां प्रकार पर संचालित होती हैं, न कि गेटर्स या सेटर्स।

यदि कोई नहीं है तो क्या हम आविष्कार कर सकते हैं?

इसके लिए सी # विनिर्देश में परिवर्तन की आवश्यकता होगी - ऐसा होने की संभावना नहीं है।

ऐसे अन्य दृष्टिकोण हैं जिन्हें आप आसानी से ले सकते हैं - एक बेस क्लास का उपयोग करके एक विधि जो बॉयलर प्लेट को उदाहरण के लिए कॉल करेगी।

+0

एक और दिलचस्प दृष्टिकोण। क्या आप मेरा जवाब देख सकते हैं और देख सकते हैं कि यह भी व्यवहार्य है? मैं आपकी राय मानता हूं क्योंकि आपकी प्रतिष्ठा आपको पहले करती है। शायद यह बहुत भारी है? –

0

उन्होंने इसे 4.0 में नहीं बनाया, लेकिन 5.0 में शामिल होने की अफवाह है।

मुझे this संपर्क सहायक पाया।

4

NotifyPropertyWeaver देखें। यह आपकी प्रक्रिया को INotifyPropertyChanged पैटर्न लागू करने के लिए निर्माण प्रक्रिया के दौरान आपके कोड को संशोधित करेगा।

यह एक Visual Studio Extension

+0

मुझे लगता है कि यह पोस्टशर्प जैसी चीजों के साथ एओपी के लिए एक अग्रदूत था या उन्हें पता नहीं था कि पोस्टशर्प मौजूद था? –

+0

@ बिगएम मैं वास्तव में इस बात के बारे में निश्चित नहीं हूं कि कैसे काम करता है। मुझे पता है कि वे दोनों आईएल बुनाई का उपयोग करते हैं, इसलिए वे अवधारणा में समान हैं। कारण मैं NotifyPropertyWeaver का उपयोग करता हूं, आपको विशेषताओं के साथ अपने कोड को अव्यवस्थित करने की आवश्यकता नहीं है। – cadrell0

+0

उस समाधान का उपयोग करने के लिए अच्छा कारण है। PostSharp *** बहुत *** सामान्य है और यह ** एक ** दर्द बिंदु को हल करने के लिए उपयुक्त है, यह निश्चित रूप से अधिक संक्षिप्त होने जा रहा है! –

0

रूप में उपलब्ध है आप सेट पर ही ऐसा नहीं कर सकता है। यह एक कार्रवाई है।

public static class extensions() 
{ 
    public static NotifyAccessorSet(this string value) { some code } 
} 

public class SomeClass() 
{ 
    ..... 
    private string mAccessor; 

    public string LazyAccessor{ 
    get { return mAccessor; } 
    set { mAccessor = value; mAccessor.NotifyAccessorSet(); } 
    } 

} 

यह मेरे सिर के ऊपर से कुछ हद तक है और यह ध्यान रखें कि विस्तार विधि सभी प्रकार स्ट्रिंग के लिए लागू होता है ताकि आप अपने वापसी प्रकार को लागू करने और लागू करने के लिए चाहते हो सकता है: आप फिर भी यह करने के लिए सक्षम हो सकता है इसके लिए विस्तार विधि। तब उस प्रकार लौटें lazyaccessor से।

+0

मुझे यकीन नहीं है, लेकिन मुझे लगता है कि NotifyPropertyEvent को आग लगाना आपको मूल वस्तु (प्रेषक) और संपत्ति का नाम (इस नमूने में "LazyAccessor") जानने की आवश्यकता है। तो आपका कोड इसे और भी अधिक चतुर बना देगा। – Ondra

+0

आपके पास मूल वस्तु होगी ... यह NotifyAccessorSet फ़ंक्शन में "मान" होगा। किसी भी मामले में ... बस एक सुझाव। यह दृष्टिकोण एक अतिरिक्त फ़ंक्शन कॉल लागू करेगा, यह केवल सेट विधि में अधिसूचना को लागू करने का एक तरीका प्रदान करेगा। – DRobertE

0

आप कस्टम जेनेरिक स्ट्रक्चर के रूपांतरण ऑपरेटरों को ओवरराइड करके ईवेंट मैनुअल को कॉल किए बिना 'संपत्ति जैसी' व्यवहार का अनुकरण कर सकते हैं। के बाद मेरे समाधान है:

public struct column<TType> 
{ 
    private TType _value; 

    private column(TType value) : this() 
    { 
     _value = value; 
    } 

    private void Set(TType value) 
    { 
     // Implement your custom set-behavior... 
    } 

    private TType Get() 
    { 
     // Implement your custom get-behavior... 
     return _value; 
    } 

    public override string ToString() 
    { 
     return _value.ToString(); 
    } 

    public static implicit operator column<TType>(TType p) 
    { 
     column<TType> column = new column<TType>(p); 
     column.Set(p); 
     return column; 
    } 

    public static implicit operator TType(column<TType> p) 
    { 
     return p.Get(); 
    } 
} 

मैं एक सामान्य पैरामीटर रूपांतरण त्रुटियों से बचने के लिए साथ struct की घोषणा। आप इसे इस तरह उपयोग कर सकते हैं:

public class Test 
{ 
    public column<int> kKey; 

    public column<float> dMoney; 

    public column<string> cValue; 


    public Test() 
    { 
     kKey = 42; 
     dMoney = 3.1415926f; 
     cValue = "May the force be with you!"; 
    } 
} 

... मुझे पता है, सवाल पुराना है लेकिन यह भविष्य में किसी की मदद कर सकता है।

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