Pergunta

O problema que estou tendo atualmente é mapear vários campos GUI para propriedades de objeto (i Apresentação camada de mapeamento de camada de lógica de negócios). Para ser mais específico, isto é, em WinForms VB.Net 2.0.

A natureza da solução obriga-nos a ter 4 colunas que exibem o mesmo tipo de comportamento em nosso GUI - cada coluna consistindo em 11 caixas de texto (que vamos usar este pequeno tamanho da amostra, como o problema se estende para além 11 caixas de texto) .

O que eu estou fazendo atualmente está definindo a tag de cada caixa de texto em todas as quatro colunas para um valor assim:

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

Quando um evento é gerado pela caixa de texto (por exemplo keypress), eu olhar para o recipiente pai, cuja tag Eu também definido como uma string mapeamento de um objeto específico. Eu uso que, em conjunto com a tag da caixa de texto, para determinar qual objeto de propriedade Eu preciso definir. No geral, é algo como isto:

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

Como você pode ver isso pode ficar muito ruim, muito rapidamente. Atualmente estamos assentados 43 algumas propriedades estranhas que podem ser mapeados para - assim que select é extremamente longa - muitos dos quais são incorporados em vários métodos para tentar e DRY tentativa (eu aguado o código para, essencialmente, um conceitual implementação).

A pergunta é: como posso refatorar isso? Eu tenho tentado usar um dicionários / hashes até certo ponto, mas quer se tornou excessivamente complexa, ou simplesmente não fazer uma sensação de implementação como complicado o problema ainda mais.

Obrigado pela ajuda.

Foi útil?

Solução

O primeiro problema que você Sol, definindo a tag como o objeto. Desde tag não é uma string, mas de tipo de objeto.

E o segundo problema a resolver pelo usin reflexão, mas que o valor do tag deve corresponder ao propertyname exatamente.

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

Disclaimer o reflexo está perto, mas talvez não 100% correto.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top