将大量参数传递到配置对话框的最佳方法

时间:2008-09-02 17:44:32

标签: c#

我有一个情况,我有一个主窗体,弹出一个高级配置表单,只有六个匹配的复选框和组合框,以选择一些高级选项(复选框启用/禁用,组合如果启用则选择媒体。)

如果我只是将检查和组合框的各个设置传递给对话框的构造函数,这显然是十几个参数,这看起来有点过分。

我的另一个显而易见的选择是,因为在主窗体中这些设置存储在一个大的IDictionary中,其中包含所有其他主要的表单设置,我可以直接传入这个字典,然后使用更新的值将其取回,但我的理解是这不是一个非常好的编码实践。

我是否错过了一个有效且良好的编码实践的好方法?

(这个特殊的代码在C#中,虽然我觉得一般的解决方案也适用于其他语言)

4 个答案:

答案 0 :(得分:6)

我个人会创建一个载体对象来存储值。然后你得到了很好的intellisense,对它的改变将非常简单。它也比参数值的字典查找更快。当然,你得到了类型安全。 :)

答案 1 :(得分:1)

你可以选择Rob的解决方案;这是发展最漂亮的。您的“运营商对象”可以包含整个IDictionary,并具有类型属性以帮助智能感知。属性可以更新IDictionary。完成后,您可以传回运营商对象并直接从中获取IDictionary。

例如,如果你的字典有键/值对“FirstEnabled”/ boolean,你可以这样做:

class ContainerObject
{
    public IDictionary<object, object> _dict;
    public ContainerObject(IDictionary<object, object> dict)
    {
        _dict = dict;
    }

    public bool FirstEnabled
    {
        get { return (bool) _dict["FirstEnabled"]; }
        set { _dict["FirstEnabled"] = value; }
    }
}

您可以将成员“_dict”更改为private或protected,并根据需要使用访问者功能。

答案 2 :(得分:0)

这样的事情应该是好的:

MyConfigurationDialog dialog = new MyConfigurationDialog();

//Copy the dictionary so that the dialog can't mess with our settings
dialog.Settings = new Dictionary(existingSettings);

if(DialogResult.OK == dialog.Show()) {
  //grab the settings that the dialog may have changed
  existingSettings["setting1"] = dialog.Settings["setting1"];
  existingSettings["setting2"] = dialog.Settings["setting2"];
}

答案 3 :(得分:0)

我同意Rob Cooper。创建一个表示您的配置的类,并将其传递给表单的构造函数。这也允许您在新的“config”类上定义方法,如“saveSettings”,“LoadSettings”等。这反过来应该使代码更易于维护。

作为一种快速而又脏的选择,如果您将这些文件保存到某个文件中,只需传递该文件的名称,并在运行时读取该表单。

第一个选择真的是要走的路,IMO。