0

私が現在抱えている問題は、複数のGUIフィールドをオブジェクトプロパティにマッピングすることです(つまり、プレゼンテーション層からビジネスロジック層へのマッピング)。具体的には、これはVB.Net2.0WinFormsにあります。

ソリューションの性質上、GUIで同じタイプの動作を示す4つの列が必要です。各列は11のテキストボックスで構成されます(問題は11のテキストボックスを超えるため、この小さなサンプルサイズを使用します)。

私が現在行っているのは、4つの列すべての各テキストボックスのタグを次のような値に設定することです。

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

ご覧のとおり、これは非常に早く悪化する可能性があります。現在、マップできるいくつかの奇妙なプロパティを設定しています-したがって、selectステートメントは非常に長いです-それらの多くは、DRYを試行するために複数のメソッドに埋め込まれています(私はコードを本質的に概念的なものに骨抜きにしました実装)。

質問は:どうすればこれをリファクタリングできますか?辞書/ハッシュをある程度使用しようとしましたが、複雑になりすぎたか、問題がさらに複雑になったため、実装が意味をなさなかっただけです。

助けてくれてありがとう。

4

1 に答える 1

1

タグをオブジェクトとして設定することによって解決する最初の問題。タグは文字列ではなくオブジェクト型なので。

リフレクションを使用して解決する 2 番目の問題ですが、タグの値はプロパティ名と正確に一致する必要があります。

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

反省は近いですが、おそらく100%正しいとは限りません。

于 2009-06-17T14:47:05.323 に答える