2012-02-15 11 views
5

पर कार्यक्षमता का विस्तार करना वर्तमान में मैं ऐसे टूल में काम कर रहा हूं जिसे कुछ अतिरिक्त फ़ील्ड के साथ कुछ प्रकार के अनुकूलित .NET बनाने की आवश्यकता है। मैं सोच रहा है क्या दृष्टिकोण इस हल करने के लिए बेहतर है, और इन विकल्पों में सोच रहा:.NET नियंत्रण

विकल्प A: - प्रत्येक नियंत्रण के लिए एक व्युत्पन्न वर्ग बनाएँ (मान लें, CLabel, CGroupBox ...) जहां मैं प्रत्येक वर्ग पर नए क्षेत्रों को परिभाषित करता हूं। इसका मतलब खराब मानसिकता होगी लेकिन के साथ काम करना आसान होगा।

उदाहरण:

class CLabel: Label 
{ 
    public List<Control> RelatedControls {get; set;} 
    public String textHint; 
    // more stuff... 

    public CLabel() 
    {} 
} 

विकल्प बी: - इस विकल्प का मतलब होगा प्रत्येक नियंत्रण से एक व्युत्पन्न वर्ग बनाने नहीं है, लेकिन वास्तविक लेबल, GroupBox, आदि नियंत्रण का उपयोग और एक वर्ग encapsulating बनाने सब "अतिरिक्त" गुण। यह अतिरिक्त गुण वस्तु Control.Tag संपत्ति में संदर्भित की जाएगी। मुझे इस बारे में संदेह है क्योंकि Tag संपत्ति के अंदर एक जटिल वस्तु का संदर्भ देने से मुझे थोड़ा परेशान लगता है, लेकिन यह का अर्थ बेहतर मानसिकता और निश्चित रूप से subclassing नियंत्रण की आवश्यकता नहीं होगी।

उदाहरण:

Label lbl = new Label(); 
lbl.Tag = new ControlDescription(); 

विकल्प C: - इस विकल्प ए और बी बस कस्टम नियंत्रण बनाने के संयोजन के कुछ प्रकार के होने का मतलब होगा, उदाहरण के CLabel, कि एक प्रकार ControlDescription क्षेत्र कहते हैं के लिए लेबल नियंत्रण के लिए। इस तरह हम encapsulation और mantainability सुनिश्चित करते हैं, लेकिन हम Tag बात से बचें।

मुझे पूरा यकीन है कि वहां से बहुत सारे विकल्प बेहतर हैं। संभवत: सिर्फ पॉलीमोर्फिज्म का उपयोग करना - एक अवधारणा जिसमें मुझे अभी भी समस्या है - कस्टम नियंत्रण कक्षाओं को हटाया जा सकता है। आपको लगता है कि उन विकल्पों में से कौन सा सबसे अच्छा विकल्प है? क्या आपको लगता है कि यह सब बेहतर किया जा सकता है?

उत्तर

2

आप डिजाइन समय में संपत्तियों की आसान नियंत्रण की जरूरत है और आप इस तरह से आप उन्हें पहली नियंत्रण लपेटकर बिना विभिन्न नियंत्रण के लिए गुण प्रदान कर सकते इस http://msdn.microsoft.com/en-us/library/system.componentmodel.iextenderprovider.aspx

पर आप एक ताला होना चाहिए विंडोज़ रूपों के साथ जाना चाहिए।

+0

धन्यवाद, मैं इसे भी देख लूंगा। –

1

यदि मैं आपको सही ढंग से समझता हूं, तो मैं यहां एक्सटेंशन विधियों का उपयोग करना पसंद करूंगा। यदि आपको प्रत्येक नियंत्रण के लिए कुछ कस्टम मानों को स्टोर करने की आवश्यकता है - तो आप उन्हें स्थिर शब्दकोश (नियंत्रण, मान) में संग्रहीत कर सकते हैं लेकिन इसे एक्सेस करने के लिए एक्सटेंशन विधियों का उपयोग कर सकते हैं, इसलिए ऐसा लगता है कि आपके पास कुछ मूल्यों के साथ नियंत्रण है।

public static class Extension 
{ 
    private static Dictionary<Control, string> _controlStrings; 

    public static void GetString(this Control ctrl) 
    { 
     return _controlStrings[ctrl]; 
    } 
} 

उसके बाद आप की तरह इस विधि का उपयोग कर सकते हैं::

एक उदाहरण जोड़ा

Button btn = new Button(); 
string s = btn.GetString(); 
+0

कुछ प्रकार के शब्दकोश होने के कारण भी एक अच्छा समाधान लगता है, और यदि मैं गलत नहीं हूं, तो .NET नियंत्रणों को विस्तारित करने की आवश्यकता नहीं है। विस्तार विधियों पर एक नज़र डालेंगे, क्योंकि यह ऐसा कुछ है जिसे मैं नहीं जानता। –

0

शायद आप इस कोशिश कर सकते:

public class ExtensionData 
{ 
    //put your data here 
} 

public class Extended<T> 
    where T : Control 
{ 
    public Extended(T baseControl) 
    { 
     BaseControl = baseControl; 
    } 

    public T BaseControl { get; set; } 

    public ExtensionData Extension { get; set; } 
} 

यह अपने तरह है " विकल्प बी ", लेकिन" टैग "संपत्ति का उपयोग किए बिना

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