2009-06-17 5 views
0

私は現在、複数のGUIフィールドをオブジェクトプロパティ(すなわち、プレゼンテーションレイヤーからビジネスロジックレイヤーマッピングへ)にマッピングしています。具体的には、これはVB.Net 2.0 WinFormsにあります。GUIからビジネスオブジェクトへのマッピングVB.Net

ソリューションの性質上、我々の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を試して試してみるために複数のメソッドに組み込まれています(私はコードを基本的に実装)。

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

ありがとうございます。

答えて

1

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

リフレクションではなくタグの値で解決する2番目の問題は、propertynameと正確に一致する必要があります。

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

免責事項近似は近似しているかもしれませんが、おそらく100%正確ではありません。

+0

反射が実際にうまくいくでしょう。各値が少し複雑に設定されていることだけです。ですから、objectToMap.Customer.Name = sender.textとobjectToMap.Asset.Type = sender.textのように入れ子になったプロパティを取得/設定する必要があります。複雑なレイヤを追加しました – MunkiPhD

+0

私はあなたがルールを変更したら、私は答えを変えなければなりません。ネストされたプロパティの問題も、リフレクションBTWで簡単に解決できます。しかしそれは問題ではありませんでした。 – chrissie1

関連する問題