2012-02-15 11 views
5

Attualmente sto lavorando a uno strumento che deve creare una sorta di .NET personalizzato con alcuni campi aggiuntivi. Mi chiedevo quale approccio è migliore per risolvere questo e pensato nei seguenti opzioni:Funzionalità di espansione per i controlli .NET

Opzione A: - Creare una classe derivata per ogni controllo (diciamo, CLabel, CGroupBox ...) dove definisco i nuovi campi su ogni classe. Ciò significherebbe peggiore manutenibilità ma sarebbe facile da utilizzare con.

Esempio:

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

    public CLabel() 
    {} 
} 

Opzione B: - Questa opzione significherebbe non la creazione di una classe derivata da ogni controllo, ma utilizzando l'etichetta reale, GroupBox, ecc controlli e la creazione di una classe che incapsula tutto il proprietà "extra". Questo oggetto proprietà aggiuntive verrebbe referenziato nella proprietà Control.Tag. Ho dei dubbi su questo perché il riferimento a una specie di oggetto complesso all'interno della proprietà Tag mi sembra un po 'schifoso, ma questo significherebbe una migliore maneggevolezza e ovviamente non c'è bisogno di controlli di sottoclasse.

Esempio:

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

Opzione C: - Ciò significherebbe avere una sorta di combinazione di opzione A e B. Basta creare il controllo personalizzato, ad esempio CLabel, che aggiunge un campo ControlDescription tipo al controllo Label. In questo modo garantiamo l'incapsulamento e la manutenibilità, ma evitiamo la cosa Tag.

Sono sicuro che ci sono molte opzioni migliori di quelle. Probabilmente usando solo il polimorfismo - un concetto con cui ho ancora problemi - le classi di controllo personalizzate potrebbero essere portate via. Quale di queste opzioni pensi sia la migliore? Pensi che tutto questo potrebbe essere fatto meglio?

risposta

1

Se ho capito bene, preferirei utilizzare i metodi di estensione qui. Se è necessario memorizzare alcuni valori personalizzati per ogni controllo, è possibile memorizzarli nel dizionario statico (Controllo, Valore), ma utilizzare i metodi di estensione per accedervi, quindi sembrerebbe che si disponga di controlli con alcuni valori aggiunti.

Aggiunto un esempio:

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

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

Dopo di che è possibile utilizzare questo metodo come:

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

Avere una sorta di dizionario suona anche una buona soluzione, e non c'è bisogno di estendere i controlli .NET, se non sbaglio. Daremo un'occhiata ai metodi di estensione, perché è qualcosa che non conosco. –

0

Probabilmente si potrebbe provare questo:

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; } 
} 

E 'come il vostro " opzione B ", ma senza utilizzare la proprietà" Tag "

Problemi correlati