2012-02-15 11 views
5

Actualmente estoy trabajando en una herramienta que necesita crear algún tipo de .NET personalizado con algunos campos adicionales. Me he estado preguntando qué enfoque es mejor para resolver esto, y pensando en el estado las siguientes opciones:Funcionalidad en expansión para .NET Controls

Opción A: - Crear una clase derivada para cada control (digamos, CLABEL, CGroupBox ...) donde defino los nuevos campos en cada clase. Esto significaría peor capacidad de mantenimiento pero sería fácil de operar con.

Ejemplo:

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

    public CLabel() 
    {} 
} 

Opción B: - Esta opción significaría no crear una clase derivada de cada control, pero utilizando la etiqueta real, GroupBox, etc controles y la creación de una clase que encapsula todo el propiedades "extra". Se hará referencia a este objeto de propiedades adicionales en la propiedad Control.Tag. Tengo dudas sobre esto porque hacer referencia a un tipo de objeto complejo dentro de la propiedad Tag me parece un poco malo, pero esto significaría una mejor capacidad de mantenimiento y también, por supuesto, no es necesario crear controles de subclases.

Ejemplo:

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

Opción C: - Esto significaría tener algún tipo de combinación de la Opción A y B. Sólo la creación el control personalizado, por ejemplo CLABEL, que añade un campo ControlDescription tipo al control de etiqueta. De esta manera aseguramos la encapsulación y la capacidad de mantenimiento, pero evitamos la cosa Tag.

Estoy bastante seguro de que hay muchas opciones mejores que esas. Probablemente solo use polimorfismo, un concepto con el que aún tengo problemas, las clases de control personalizadas podrían retirarse. ¿Cuál de esas opciones crees que es la mejor? ¿Crees que todo esto podría hacerse mejor?

Respuesta

1

Si te entiendo correctamente, preferiría usar métodos de extensión aquí. Si necesita almacenar algunos valores personalizados para cada control, puede almacenarlos en el diccionario estático (Control, Valor) pero use métodos de extensión para acceder a él, de modo que parece que tiene controles con algunos valores agregados.

Añadido un ejemplo:

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

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

Después de que se puede utilizar este método como:

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

Tener algún tipo de diccionario también suena como una buena solución, y no es necesario ampliar los controles .NET, si no me equivoco. Echaremos un vistazo a los métodos de extensión, porque es algo que desconozco. –

0

Probablemente usted podría intentar esto:

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

Es como si tu " opción B ", pero sin usar la propiedad" Etiqueta "