Frage

Die Frage, die ich zur Zeit habe, ist mehrere GUI-Felder zuordnen, Objekteigenschaften (das heißt Darstellungsschicht auf Business-Logik-Schicht-Mapping). Um genauer zu sein, ist dies in VB.Net 2.0 WinForms.

Die Art der Lösung erfordert, dass uns 4 Spalten haben, die die gleiche Art von Verhalten auf unserer GUI zeigen - jede Spalte, bestehend aus 11 Textfeldern (wir nur diese kleine Stichprobengröße verwenden, da das Problem über 11 Textfelder erstreckt) .

Was ich derzeit tun, ist den Tag jeden Textfeldes in allen vier Spalten auf einen Wert wie folgt:

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

Wenn ein Ereignis durch die Textbox angehoben wird (z.B. Druck), sehe ich den übergeordneten Container, dessen Tag-Ich habe auch als String Abbilden eines bestimmten Objekts festlegen. Ich benutze das in Verbindung mit der Tag der Textbox, um zu bestimmen, welches Objekt der Eigenschaft I einstellen muß. Insgesamt ist es so etwas wie folgt aussieht:

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

Wie Sie sehen dies sehr schlecht bekommen, ziemlich schnell. Zur Zeit sind wir 43 einige seltsame Eigenschaften festlegen, die abgebildet werden können - so dass select-Anweisung ist extrem lang - von denen viele in mehrere Methoden eingebettet sind, um zu versuchen und versuchen, DRY (ich habe den Code verwässert im Wesentlichen ein konzeptionelles Implementierung).

Frage: Wie kann ich das Refactoring? Ich habe versucht, eine Wörterbücher mit / Hashes zu einem gewissen Grad, aber es entweder wurde zu komplex oder einfach habe schlicht keine Implementierung sinnvoll, da es das Problem noch gewunden.

Danke für die Hilfe.

War es hilfreich?

Lösung

das erste Problem, das Sie Sol durch das Tag als das Objekt einstellen. Da Tag nicht String ist aber vom Typ Objekt.

Und das zweite Problem, das Sie durch usin Reflexion lösen, sondern als der Wert in dem Tag muss das Eigenschaftsname exakt übereinstimmen.

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

Disclaimer die Reflexion ist in der Nähe, aber vielleicht nicht zu 100% korrekt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top