我目前面临的问题是将多个GUI字段映射到对象属性(即表示层到业务逻辑层映射)。更具体地说,这是在VB.Net 2.0 WinForms中。
解决方案的性质要求我们有4列在我们的GUI上表现出相同类型的行为 - 每列包含11个文本框(我们只使用这个小样本,因为问题超出了11个文本框)
我目前正在做的是将所有四列中每个文本框的标记设置为如下值:
Textbox1.tag = "name"
Textbox2.tag = "type"
Textbox3.tag = "speed"
当文本框引发事件时(例如按键),我查看父容器,其标签我也设置为映射特定对象的字符串。我将它与文本框的标签结合使用,以确定我需要设置的对象属性。总的来说,它看起来像这样:
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
正如你所看到的,这可能会很快变得非常糟糕。目前我们正在设置43个可以映射到的奇数属性 - 因此select语句非常长 - 其中许多嵌入在多种方法中以尝试和尝试DRY(我已经将代码淡化为基本概念实现)。
问题是:我怎么能重构这个?我曾尝试在某种程度上使用字典/哈希,但它要么变得过于复杂,要么只是普通没有实现意义,因为它使问题更加复杂。
感谢您的帮助。
答案 0 :(得分:1)
通过将标记设置为对象来解决您遇到的第一个问题。由于tag不是字符串而是object类型。
你通过反射而不是标签中的值解决的第二个问题必须与属性名完全匹配。
_objectToMapTo.GetType().InvokeMember(sender.tag,BindingFlags.Instance Or BindingFlags.Public,Nothing, _objectToMapTo, New Object() {sender.text})
免责声明反映很接近但可能不是100%正确。