0

我目前遇到的问题是将多个 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(我已将代码淡化为本质上的概念执行)。

问题是:我该如何重构它?我曾尝试在一定程度上使用字典/哈希,但它要么变得过于复杂,要么只是简单地没有实现意义,因为它使问题更加复杂。

谢谢您的帮助。

4

1 回答 1

1

通过将标签设置为对象来解决的第一个问题。由于标签不是字符串而是对象类型。

您通过使用反射解决的第二个问题是标记中的值必须与属性名完全匹配。

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

免责声明反射很接近,但可能不是 100% 正确。

于 2009-06-17T14:47:05.323 回答