Question

Le problème que je rencontre actuellement est le mappage de plusieurs champs de l'interface graphique sur les propriétés de l'objet (c'est-à-dire, la couche Présentation vers le mappage de la couche de logique applicative). Pour être plus précis, cela se trouve dans WinForms VB.Net 2.0.

La nature de la solution exige que nous disposions de 4 colonnes qui présentent le même type de comportement sur notre interface graphique - chaque colonne étant composée de 11 zones de texte (nous allons simplement utiliser ce petit échantillon, car le problème dépasse les 11 zones de texte). .

Ce que je suis en train de faire, c'est de définir la valeur de la balise de chaque champ de texte dans les quatre colonnes:

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

Lorsqu'un événement est déclenché par la zone de texte (par exemple, une pression sur une touche), je regarde le conteneur parent, dont j'ai également défini la balise en tant que chaîne mappant un objet spécifique. J'utilise cela, en conjonction avec la balise de la zone de texte, pour déterminer la propriété de l'objet que je dois définir. Globalement, cela ressemble à quelque chose comme ceci:

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

Comme vous pouvez le constater, cela peut devenir très grave, assez rapidement. Actuellement, nous définissons 43 propriétés étranges qui peuvent être mappées - ainsi, cette instruction select est extrêmement longue - bon nombre d’entre elles sont intégrées à de nombreuses méthodes pour tenter DRY (j’ai dilué le code pour en faire un concept la mise en oeuvre).

La question est: comment puis-je refactoriser cela? J'ai essayé d'utiliser des dictionnaires / hachages dans une certaine mesure, mais cela est devenu soit trop complexe, soit tout simplement n'a pas de sens en termes de mise en œuvre car cela complique encore plus le problème.

Merci pour l'aide.

Était-ce utile?

La solution

le premier problème que vous résolvez en définissant la balise comme objet. Puisque la balise n'est pas une chaîne mais un objet de type.

Et le deuxième problème que vous résolvez en utilisant la réflexion mais que la valeur dans la balise doit correspondre exactement au propertyname.

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

Déni de responsabilité, la réflexion est proche mais peut-être pas correcte à 100%.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top