2011-11-27 13 views
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(); 
} 

在我的應用程序。還有更多的參數以這種方式處理,所以我想知道是否有某種方法可以簡化此代碼,以便枚舉設置的名稱並允許將來添加其他參數。

回答

2

只需要用getter和setter暴露一個類型爲Settings的屬性即可。這會使您發佈的代碼段變得簡單,而無需在將成員添加到設置時進行任何更改。現在,這個工作轉移到了表單實現上。 PropertyGrid是一個通用的對象編輯器,不管你的情況是否足夠可用,都很難猜測。

+0

有點像你建議的,我只是簡單地將設置對象的引用傳遞給窗體。當單擊確定按鈕時,表單代碼更新設置。將檢查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(); 
}  

PS:我知道你說的那個代碼是可怕的,但我不能更何況,你處置這是在實例化的形式一些其他的代碼 - 這是錯誤的,海事組織。

+0

嗨,我不小心剪掉了複製和粘貼代碼時作爲方法一部分的代碼實例化行。 – Andy

1

使用字典

Dictionary<String,dynamic> 

將是很好的,因爲這將推遲打字

所以您在設置類添加/組設置的所有您需要的設置應用明智的。 你的表格有它自己的實例,但只有它需要的實例。 然後,只需要在傳遞的設置中掃描相同命名版本的form.settings並覆蓋它們即可。

相關問題