Pregunta

El problema que estoy teniendo actualmente es mapear múltiples campos de GUI a propiedades de objeto (es decir, capa de presentación a mapeo de capa lógica empresarial). Para ser más específicos, esto está en WinForms de VB.Net 2.0.

La naturaleza de la solución requiere que tengamos 4 columnas que exhiban el mismo tipo de comportamiento en nuestra GUI: cada columna consta de 11 cuadros de texto (solo usaremos este pequeño tamaño de muestra, ya que el problema se extiende más allá de 11 cuadros de texto) .

Lo que estoy haciendo actualmente es configurar la etiqueta de cada cuadro de texto en las cuatro columnas a un valor como este:

Textbox1.tag = "name"
Textbox2.tag = "type"
Textbox3.tag = "speed"

Cuando el cuadro de texto genera un evento (por ejemplo, al presionar una tecla), miro el contenedor principal, cuya etiqueta también he establecido como una cadena que asigna un objeto específico. Lo uso, junto con la etiqueta del cuadro de texto, para determinar qué propiedad de objeto necesito establecer. En general, se parece a esto:

dim objectToMapTo //the generic parent object which all my custom myObjects inherit from

select case sender.parent.tag //the parent object that the property needs to map to
    case "column1"
         objectToMapTo = myObject1
    case "column2"
         objectToMapTo = myObject2
    case "column3"
         objectToMapTo = myObject3
    case "column4"
         objectToMapTo = myObject4
end select

select case sender.tag //the actual textbox's tag value which maps to the property
    case "name"
         objectToMapTo.Name = sender.text //sender.text is conceptual for 
        //the data that needs to be set -- i.e. this could be a calculated 
        //number based on the text, or simply a string, etc
    case "type"
         objectToMapTo.Type = sender.text
    case "speed"
         objectToMapTo.Speed = sender.text
    ...
end select

Como puede ver, esto puede ser muy malo, bastante rápido. Actualmente estamos configurando 43 algunas propiedades extrañas que se pueden asignar a, por lo tanto, que la instrucción select es extremadamente larga, muchas de las cuales están integradas en múltiples métodos para intentar e intentar SECAR (he diluido el código esencialmente a un concepto implementación).

La pregunta es: ¿cómo puedo refactorizar esto? Intenté usar diccionarios / hashes hasta cierto punto, pero se volvió demasiado complejo o simplemente no tenía sentido de implementación ya que complicaba aún más el problema.

Gracias por la ayuda.

¿Fue útil?

Solución

el primer problema que resuelve al configurar la etiqueta como el objeto. Dado que la etiqueta no es una cadena, sino de tipo objeto.

Y el segundo problema que resuelve usinin reflexión pero que el valor en la etiqueta debe coincidir exactamente con el nombre de la propiedad.

_objectToMapTo.GetType().InvokeMember(sender.tag,BindingFlags.Instance Or BindingFlags.Public,Nothing, _objectToMapTo, New Object() {sender.text})

Descargo de responsabilidad: el reflejo está cerca pero quizás no sea 100% correcto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top