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();
}

在我的应用程序中。以这种方式处理的还有几个参数,所以我想知道是否有某种方法可以简化此代码以枚举设置的名称并允许将来添加其他参数。

4

3 回答 3

2

Simply have the form expose a property of type Settings with a getter and a setter. That makes the snippet you posted simple without any changes needed when you add members to Settings. The effort now moves to the form implementation. PropertyGrid is a generic object editor, whether it is usable enough in your case is hard to guess.

于 2011-11-27T17:04:55.860 回答
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();
}    

PS:我知道你说代码很糟糕,但我不能不提你正在处理一个在其他代码中实例化的表单——这是错误的,IMO。

于 2011-11-27T16:37:06.617 回答
1

使用字典

Dictionary<String,dynamic> 

会很好,因为它会推迟打字

因此,您可以在设置类中添加/设置设置,以实现应用所需的所有设置。你的表单有它自己的实例,但只有它需要的实例。然后只需在传递的设置中扫描 form.settings 以获得相同命名的版本并覆盖它们。

于 2011-11-27T16:51:26.680 回答