0

いくつかのカスタムフォーム要素を含むFormクラスがあります。

要素に特定の属性を提供するEntityオブジェクトがあり、これらはXMLファイルから解析されます。すべての要素は、コンストラクターのパラメーターとしてエンティティを受け取りますが、その後、コンストラクターで異なるパラメーターを必要とします。

要素の作成には、現在、以下のswitchステートメントを使用しています。ただし、これをActivator.CreateInstanceを使用するように変換したいと思います。ただし、コンストラクターにさまざまなパラメーターがある場合、これを処理するために私が知っている唯一の方法は、すべてのパラメーターを含むDTOを作成し、それをコンストラクターに渡してから、各コンストラクターに必要な情報を要求させることです。DTOは現代の実装では嫌われているというのが私の理解であるため、代替案が必要です。

        switch (entity.GetPropertyValue("Class"))
        {
            case "FormCheckBox":
                newElement = new FormCheckBox(entity, BaseElementHeight);
                break;
            case "RowSeparator":
                newElement = new RowSeperator(entity, RowHeight, _mainCanvas);
                break;
            case "FormLabel":
                newElement = new FormLabel(entity, BaseElementHeight);
                break;
            case "FormEditBox":
                newElement = new FormEditBox(entity, _mainCanvas);//, BaseElementHeight, 600);
                break;
            case "FormComboBox":
                newElement = new FormComboBox(entity, BaseElementHeight);
                break;
            case "FormTextBox":
                newElement = new FormTextBox(entity, BaseElementHeight, TextFontSize, MaxFontBoxSize);
                break;
            default:
                return null;
        }

誰かがこれについて考えやアイデアを持っていますか?

4

2 に答える 2

0

エンティティのctorにすべてを注入するのではなく、コマンドパターンまたは ダブルディスパッチパターンを使用 してこれを管理してみませんか.

エンティティを ctor 引数として渡す代わりに、プロパティにするか、必要なプロパティだけを渡します。

new FormCheckBox
{
   Height = BaseElementHeight,
   Number = entity.Number, 
   Text = entity.Text 
   ...
};

これにより、エンティティが UI から完全に除外されます。

于 2011-12-22T13:32:10.380 に答える
0

コンストラクターにパラメーターを渡す必要がありますか? そうでない場合は、命名規則によってオブジェクトを作成することをお勧めします(あなたのケースが示すように、それが可能です)。次に、常に規則を使用して、リフレクションを介して各プロパティを設定します。XML に含まれる値は常に文字列であるため、Convert.ChangeType() でターゲット プロパティ タイプに渡して、正常に機能する割り当てを行うことができます。

于 2011-12-22T14:14:28.200 に答える