2013-12-17 29 views
0

我想知道這3 Settings.Default.<PropertyName>,Settings.Default.PropertiesSettings.Default.PropertyValues之間的區別。
我有一個WPF窗口,將動態生成基於這些Settings控制,然後一個可以更新Settings值 我第一次使用Settings.Default.Properties收藏,但我相信這不會更新任何配置或物理設置文件中的值用戶文件夾。 所以我用反射更新,但我仍然無法計算如何通過Reflection獲得 值。 (可能仍然需要在這項研究)Settings.Default。[PropertyName],Settings.Default.Properties和Settings.Default.PropertyValues之間的區別是什麼?

Settings.Default.GetType().GetProperty(propertyName, 
    typeof(string)).SetValue(source, fileDialog.FileName, null); 
Settings.Default.Save(); 
Settings.Default.Reload(); 

然後,我看到Settings.Default.PropertyValues有最近更新的數值,並在調試模式下測試的,

string properyValue = 
Convert.ToString(Settings.Default.PropertyValues[propertyName].PropertyValue); 

奇怪的是,他們似乎並沒有工作,當我創建了安裝程序和exe。仍然要弄清楚什麼是錯的。 如果我使事情複雜化並錯過某些東西,有人能指出我嗎?

更新1

nflash的評論後,我檢查創建的文件時。該文件並沒有創建時,應用程序啓動所有3,我甚至打電話Settings.Default.Save在開始的權利,但它不創建文件
Settings.Default.<PropertyName>,Settings.Default.Properties被實例化,但不是Settings.Default.PropertyValues
只有在「設置」和「保存」中進行更改後,纔會創建文件。

UPDATE2

現在,我想出瞭解決的辦法是

source.GetType().GetProperty(setting.Name, typeof(string)) 
       .SetValue(source, "NewValue", null); 

正如nflash提到的那樣,這將是類型安全的(雖然思考有它的demirits)。但Settings.Default.<PropertyName>因此被正確同步和實例化。

回答

0

要改變它們之後你必須調用

Settings.Default.Save(); 

Settings.Default.<PropertyName>是一個屬性訪問到相應的設置值,保存設置。 Settings.Default.Properties是設置文件中所有設置的集合。 Settings.Default.PropertyValues是設置文件中所有設置值的集合。

也許Using Settings in C#是一個很好的閱讀起點。

1

只是想補充一點,您只能更改「用戶」範圍的設置。當您保存設置的新值時,該值不會保存在應用程序路徑的配置中,而是保存在%localappdata%文件夾(%localappdata%\ CompanyName \ ApplicationName_someGUID \ AppVersion)內的user.config中

更新: 關於您上次更新的用戶。僅當您使用與設置的默認值不同的值保存設置時纔會創建配置文件。

我不知道,如果你仍然有這個問題,所以我想添加更多的信息:

Settings.Default.<PropertyName>作爲wonko79指出的僅僅是一個屬性訪問到相應的值。如果你看一下設置後面的代碼(或只是去屬性的定義),你會看到這樣的事情:

public string PropertyName { 
     get { 
      return ((string)(this["PropertyName"])); 
     } 
     set { 
      this["PropertyName"] = value; 
     } 
    } 

數組運算符訪問保存,其實就是價值觀的基礎結構PropertyValues。

屬性和PropertyValues之間的區別有點棘手。這些實際上是兩個不同的結構(一個是SettingsPropertyCollection,另一個是SettingsPropertyValueCollection)。 Properties屬性在ApplicationSettingsBase類中定義,PropertyValues在SettingsBase類中定義。

SettingsProperty類(SettingsPropertyCollection的元素)包含有關設置本身(元數據?)及其默認值的信息。

的SettingsPropertyValue類(SettingsPropertyValueCollection的元素)包含設置的實際值和一些附加的控制信息,如如果所述值是髒的,如果它是使用默認值等

在的端部這一整天都是.NET在內部管理設置的方式,我們需要知道的一切就是如何獲取和設置這些設置。

我一直喜歡使用設置設計器生成的屬性,因爲它是強類型的,並且已經將對象轉換爲相應的類型。同樣使用Properties或PropertyValues需要一個字符串作爲參數,如果發生拼寫錯誤,我只會在運行時得到一個錯誤,而不是我得到的編譯錯誤,如果拼錯了屬性的名稱。

+0

這是在用戶範圍內,並會更新一些發現,我觀察。 –

+0

已更新帖子。 –

+0

如果有人可以捕獲更多的信息,我會保留這個問題一段時間,另外提到'Properties'和'PropertyValues'都在ApplicationSettingsBase中實現,SettingsBase是抽象類。 –

相關問題