如何简化在主窗体和子窗体之间传递设置值的代码

3

我有一个类,用于存储我的应用程序的设置。当应用程序运行时实例化该类,并在应用程序关闭时保存。

public class Settings
{
    public bool showPrivacyPageOnBlogs;
    public bool showTermsPageOnBlogs;
    public bool showDisclosurePageOnBlogs;
}

有一个弹出窗口,显示复选框,使用弹出窗口的公共属性来设置这些值。

处理弹出窗口的代码如下:

// Horrible code ahead
private void pagesSettingsToolStripMenuItem1_Click(object sender, EventArgs e)
{
    pagesSettingsForm.showPrivacyPageOnBlogs = settings.showPrivacyPageOnBlogs;
    pagesSettingsForm.showTermsPageOnBlogs = settings.showTermsPageOnBlogs;
    pagesSettingsForm.showDisclosurePageOnBlogs = settings.showDisclosurePageOnBlogs;
    if (pagesSettingsForm.ShowDialog() == DialogResult.OK)
    {
        settings.showPrivacyPageOnBlogs = pagesSettingsForm.showPrivacyPageOnBlogs;
        settings.showTermsPageOnBlogs = pagesSettingsForm.showTermsPageOnBlogs;
        settings.showDisclosurePageOnBlogs = pagesSettingsForm.showDisclosurePageOnBlogs;
    }
    pagesSettingsForm.Dispose();
}

在我的应用程序中,还有其他一些参数也是这样处理的,因此我想知道是否有一种简化这段代码的方法,可以列举设置的名称,并允许将来添加更多的参数。

3个回答

2

只需将表单公开一个类型为Settings的属性,其中包含一个getter和setter方法。这样,在添加Settings成员时,您发布的代码片段就不需要进行任何更改。现在需要努力实现表单。PropertyGrid是一种通用对象编辑器,无法确定它在您的情况下是否足够可用。


就像你建议的那样,我只是将设置对象的引用传递给了表单。当点击确定按钮时,表单代码会更新设置。我会查看PropertyGrid。谢谢。 - Andy

2

虽然我没有试过,但我坚信Automapper可以处理这个问题。我认为它可能会让你的代码变成这样:

// Horrible code ahead
private void pagesSettingsToolStripMenuItem1_Click(object sender, EventArgs e)
{
    Mapper.Map(settings, pagesSettingsForm);
    if (pagesSettingsForm.ShowDialog() == DialogResult.OK)
        Mapper.Map(pagesSettingsForm, settings);
    pagesSettingsForm.Dispose();
}    

P.S.: 我知道你说过这段代码很糟糕,但是我不得不提一下,你正在处理某个在其他代码中被实例化的窗体,这是错误的,我个人认为。


嗨,我在复制和粘贴代码时不小心切掉了方法中的实例化代码行。 - Andy

1

使用字典

Dictionary<String,dynamic> 

这样会很好,因为它可以推迟打字。

所以你在设置类中添加/设置所有需要应用程序的设置。 表单具有自己的实例,但仅具有其所需的选项。 然后只需要扫描表单设置中与传递的设置中具有相同名称版本的设置,并覆盖它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接