2016-09-27 49 views
0

我編寫了一個代碼,用於讀取包含我的應用程序的所有配置的json的所有項目。在這段代碼中我有一個叫obj屬性:如何監視對象屬性的變化?

​​3210

SuperModel是類模型包含其他類的實例。 我試圖做到的,是更新JSON值,然後調用應該與新的JSON覆蓋該文件的另一種方法,就像這樣:

Settings.obj.GeneralSettings.Language = "english"; 
Settings.Save(); 

但是我有一個問題,我怎麼能監控在obj更改,例如在這種情況下,我已更新 - >SuperModel類的Language財產,有可能存儲更新的對象與Save()方法,覆蓋該文件? 我從來沒有遇到類似的情況。

我該如何解決這個問題?

+0

如果要將對象序列化爲文件,則不需要檢測更改:如果相同,則沒有任何更改(文件的最後修改日期除外),如果不同,則文件得到更新。你需要什麼樣的功能?你的研究表明了什麼?請參閱例如[檢查對象是否被更改的最佳做法是什麼?](http://stackoverflow.com/questions/2071482/what-is-the-best-practice-to-check-if-an-object -is-改變)。 – CodeCaster

+0

@CodeCaster我需要將更新的對象傳遞給文件以更新json文件,這就是爲什麼我需要檢測更改 – Unchained

+0

檢查此問題:http://stackoverflow.com/questions/2246777/raise-an-event-whenever -a-propertys-value-changed – Bassie

回答

1

你在問錯誤的問題。您不希望「檢測對象更新」,您希望保留對當前return聲明中超出範圍的局部變量的引用。

爲了做到這一點,加載設置文件只有一次,例如在靜態構造函數:

private static SuperModel _settingsObject; 

static Settings 
{ 
    string json = File.ReadAllText(SettingsConfig.ConfigFilePath); 
    var jsonObj = JsonConvert.DeserializeObject<SuperModel>(json); 
    _settingsObject = jsonObj; 
} 

然後,當主叫用戶獲取設置對象,簡單地返回加載的對象:

public static SuperModel obj 
{ 
    get 
    { 
     return _settingsObject; 
    } 
} 

現在任何修改由Settings.obj返回的SuperModel實例的調用者都會直接修改Settings類已知的實例。所以Save()方法保存修改的實例:

public static void Save() 
{ 
    string json = JsonConvert.SerializeObject(_settingsObject); 
    File.WriteAllText(SettingsConfig.ConfigFilePath, json); 
} 

此外,請查看.NET的命名指南。 「obj」實際上並不是一個有用的標識符。

0

讀取對象時,假設您有多個嵌套鏈,可以對對象屬性進行散列並將其存儲在某處(例如InitialHash屬性)。

無論何時您想檢查更改,都可以重新篩查對象屬性,並將其與InitialHash進行比較。這隻會告訴你對象屬性被改變了,但是沒有改變什麼。

2

您試圖解決的問題主要是不是關於如何檢測更改(Codecaster在answer linked中對此進行了很好的描述)。這裏的問題是你的設計有很大的缺陷。

您實際上在濫用屬性來做方法應該做的事情。您的財產表現爲數據生成器,每次調用時都會返回一個新實例(儘管從值的角度來看它們是相同的)。您永遠不會將反序列化的設置存儲在任何地方,因此毫無疑問沒有簡單的方法來實現Save()方法。

解耦你的代碼,實現這樣一個使用模式:

Settings.LoadFromConfig(); 

… do whateever changes you need here … 
Settings.MyConfig.GeneralSettings.Language = "english"; 

Settings.SaveToConfig(); 

LoadFromConfigSaveFromConfig方法應該用SuperModel屬性,它可以簡單地聲明如下工作:

public SuperModel MyConfig { get; private set; } 

(除了Settings類別可以創建新的配置實例外,私人設置程序確保沒有人員訪問。)

LoadFromConfigSaveFromConfig的實際執行應該很容易。

附註:看起來你的Settings類是靜態的。雖然它可能是有意義的,但通常更好地工作而不是實例,儘管它是singleton

+0

你的代碼如何保持更新json文件? – Unchained

+0

@解開我的代碼?這是你的代碼;)繼續並實現'SaveToConfig'方法。這是微不足道的,與已經實施的負載相反。 –