代码之家  ›  专栏  ›  技术社区  ›  MunkiPhD

图形用户界面到业务对象映射vb.net

  •  0
  • MunkiPhD  · 技术社区  · 15 年前

    我目前面临的问题是将多个GUI字段映射到对象属性(即表示层到业务逻辑层的映射)。更具体地说,这是在vb.net 2.0 winforms中实现的。

    解决方案的性质要求我们有4列,它们在GUI上显示相同的行为类型——每列包含11个文本框(我们只使用这个小的示例大小,因为问题扩展到11个文本框之外)。

    我目前正在做的是将所有四列中每个文本框的标记设置为这样的值:

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

    当一个事件被文本框(如keypress)引发时,我会查看父容器,它的标记也被设置为映射特定对象的字符串。我将它与文本框的标记结合使用,以确定需要设置的对象属性。总的来说,它看起来是这样的:

    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语句非常长——其中许多属性嵌入到多种方法中以尝试干燥(我已经将代码简化为基本的概念实现)。

    问题是:如何重构这个?我曾经尝试过在某种程度上使用字典/哈希表,但它要么变得过于复杂,要么只是简单的实现,因为它会使问题更加复杂化。

    谢谢你的帮助。

    1 回复  |  直到 15 年前
        1
  •  1
  •   chrissie1    15 年前

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

    第二个问题是通过反射而不是标记中的值来解决,它必须与propertyname完全匹配。

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

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