2016-09-27 31 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'方法。这是微不足道的,与已经实施的负载相反。 –