2016-09-27 16 views
0

私はアプリケーションのすべての設定を含むjsonからすべての項目を読み込むコードを書いた。このコードでは、私はobjというプロパティました:オブジェクトプロパティの変更を監視する方法は?

​​3210

SuperModelを他のクラスのインスタンスを含むクラスモデルです。 は私が達成しようとしているされた更新JSON値とし、このように、新しいJSONを持つファイルを上書きする必要があり、別のメソッドを呼び出します。

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

しかし、私は問題をした、どのように私が監視することができますobjに変更します。たとえば、LanguageプロパティをGeneralSettings - >SuperModelクラスに更新しました。ファイルを上書きするSave()メソッドで更新されたオブジェクトを保存することは可能ですか? 私は似たような状況に遭遇したことはありません。

どうすればこの問題を解決できますか?

+0

オブジェクトを再度ファイルにシリアル化する場合は、変更を検出する必要はありません。同じ場合は何も変更されません(ファイルの最終変更日を除く)。更新されます。どんなに正確にこの機能が必要ですか?あなたの研究は何を示しましたか?たとえば、[オブジェクトが変更されたかどうかをチェックするベストプラクティスは何ですか?]を参照してください(http://stackoverflow.com/questions/2071482/what-is-the-best-practice-to-check-if-an-object - 変更されました)。 – CodeCaster

+0

@CodeCaster jsonファイルを更新するために、更新されたオブジェクトをファイルに渡す必要があります。そのため、変更を検出する必要があります。 – Unchained

+0

この質問を確認してください:http://stackoverflow.com/questions/2246777/raise-an-event-whenever -a-propertys-value-changed – Bassie

答えて

1

あなたは間違った質問をしています。 「オブジェクトの更新を検出したくない」場合は、現在のreturnステートメントで範囲外になるローカル変数への参照を保持する必要があります。

public static SuperModel obj 
{ 
    get 
    { 
     return _settingsObject; 
    } 
} 
:呼び出し側が設定オブジェクト、単純にロードされたオブジェクトを返す取得するとその後

private static SuperModel _settingsObject; 

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

:これを行うには、設定は静的コンストラクタで例えば、一度だけファイルをロードするために

SuperModelインスタンスを変更した発信者がSettings.objによって返された場合、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

@Unchained My code?あなたのコードです;) 'SaveToConfig'メソッドを実装してください。それはあなたがすでに実装している負荷の反対です。 –

関連する問題