Implementando un proveedor de formularios

En la lista: microsoft.public.es.dotnet.framework, AsierMM pregunto lo siguiente:

Hola tengo muchas formularios en mi proyecto y una funcion que los abre.
Por parametro recivire su nombre y me gustaria saber una forma de hacer un
new de ese informe pero de una forma que no tenga que hacer un case y hacer
su new.
La idea es tener un new unico para todos los formularios.
Yo estaba pensando en si existia una funcion estilo a la Eval de JavaScript
que me permitiese evaluar el “new ‘Nombre de informe’ ”
Bueno cualquier idea sera bien recivida. Muchas gracias a todos

La mejor respuesta que se me ocurrió, la que yo implementaría fue la siguiente:

Suponte que tienes 2 formularios: frmCliente y frmProveedor. Creas un interfaz como el siguiente:

.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }.cl { margin: 0px; }.cln { color: #2b91af; }.cb1 { color: blue; }.cb2 { color: teal; }

1 public interface IFormElement

2 {

3 string Nombre { get;}

4 Form ObtenerFormulario();

5 }

Escribes una implementacion del interfaz para cada formulario:

.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }.cl { margin: 0px; }.cln { color: #2b91af; }.cb1 { color: blue; }.cb2 { color: teal; }.cb3 { color: maroon; }

1 public class FormClienteElement : IFormElement

2 {

3 public string Nombre

4 {

5 get { return “frmCliente”; }

6 }

7

8 public Form ObtenerFormulario()

9 {

10 return new frmCliente;

11 }

12 }

13

14 public class FormProveedorElement : IFormElement

15 {

16 public string Nombre

17 {

18 get { return “frmProveedor”; }

19 }

20

21 public Form ObtenerFormulario()

22 {

23 return new frmProveedor;

24 }

25 }

y creas una clase Factoria que mantiene una lista de los IFormElement y busca el que quieres:

.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }.cl { margin: 0px; }.cln { color: #2b91af; }.cb1 { color: blue; }.cb2 { color: teal; }

1 public class FormElementFactory

2 {

3 public static IList<IFormElement> TodosLosFormularios()

4 {

5 IList<IFormElement> objLista = new List<IFormElement>();

6 objLista.Add(new FormClienteElement());

7 objLista.Add(new FormProveedorElement());

8 return objLista;

9 }

10

11

12 public static Form GetFormulario(string strNombreFormulario)

13 {

14 foreach (IFormElement formElement in TodosLosFormularios)

15 {

16 if (formElement.Nombre == strNombreFormulario)

17 return formElement.ObtenerFormulario();

18 }

19 return null;

20 }

21 }

Cuando quieras obtener un formulario solo tienes que hacer como sigue:

.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }.cl { margin: 0px; }.cln { color: #2b91af; }.cb1 { color: teal; }.cb2 { color: maroon; }

1 frmCliente frm = (frmCliente)FormElementFactory.GetFormulario(“frmCliente”);

o:

.cf { font-family: Courier New; font-size: 10pt; color: black; background: white; }.cl { margin: 0px; }.cln { color: #2b91af; }.cb1 { color: teal; }.cb2 { color: maroon; }

1 frmProveedor frm = (frmProveedor)FormElementFactory.GetFormulario(“frmProveedor”);

Cuando quieras añadir un nuevo formulario a esta factoria, solo tienes que crear una implementacion del IFormElement (2 lineas de codigo no automatico) y añadir el elemento a la lista de la factoria (1 linea de codigo).

Esto viene de un post que puse hace unos dias confesando mi odio a los multiples switch.

Todavía no hay comentarios

Enviar un comentario nuevo

El contenido de este campo se mantiene privado y no se mostrará públicamente.
  • Etiquetas HTML permitidas: <a> <blockquote> <br> <cite> <code> <dd> <div> <dl> <dt> <em> <h1> <h2> <h3> <h4> <h5> <h6> <hr> <img> <li> <ol> <p> <pre> <span> <strong> <swf> <table> <tbody> <td> <th> <tr> <ul>
    Allowed Style properties: background-color, background-image, border, border-bottom, border-bottom-color, border-bottom-style, border-bottom-width, border-color, border-left, border-left-color, border-left-style, border-left-width, border-right, border-right-color, border-right-style, border-right-width, border-spacing, border-style, border-top, border-top-color, border-top-style, border-top-width, border-width, color, direction, font, font-family, font-size, font-style, font-variant, font-weight, height, left, line-height, list-style-type, margin, margin-bottom, margin-left, margin-right, margin-top, padding, padding-bottom, padding-left, padding-right, padding-top, right, text-align, text-decoration, top, width
  • Syntax highlight code surrounded by the {syntaxhighlighter OPTIONS}...{/syntaxhighlighter} tags.
  • E-Mail addresses are hidden with reCAPTCHA Mailhide.

Más información sobre opciones de formato

CAPTCHA
Esta pregunta es para comprobar si eres un ser humano y evitar el envío automático desde sistemas de spam