2017-08-18 5 views
-1

J'écris un plugin pour un logiciel qui nécessite tout le code pour être dans une seule classe (ou classes imbriquées) ...méthode pour définir la propriété Nested Valeur

Ce que je veux faire est de vouloir créer une méthode qui peut gérer les modifications apportées aux propriétés imbriquées de mon objet _data et me donner une place centrale pour faire des choses comme la définition d'un drapeau sale afin que je sache le sauvegarder plus tard. Ci-dessous figure un code illustrant la structure de mon fichier et, en bas, deux pseudo-méthodes qui, je l'espère, peuvent vous donner une idée de ce que j'essaie d'accomplir.

public class SomePlugin 
{ 
    private DataObject _data; 
    private bool _dataIsDirty = false; 

    private class DataObject 
    { 
     public GeneralSettings Settings { get; set; } 
    } 

    private class GeneralSettings 
    { 
     public string SettingOne { get; set; } 
     public string SettingTwo { get; set; } 
    } 

    protected override void Init() 
    { 
     _data = new DataObject 
     { 
      Settings = new GeneralSettings 
      { 
       SettingOne = "Example value one.", 
       SettingTwo = "Example value two." 
      } 
     } 
    } 

    // These are pseudo-methods illustrating what I'm trying to do. 
    private void SetData<t>(T ref instanceProperty, T newValue) 
    { 
     if (newValue == null) throw new ArgumentNullException("newValue"); 
     if (instanceProperty == newValue) return; 

     instanceProperty = newValue; 
     _dataIsDirty = true; 
    } 

    private void SomeOtherMethod() 
    { 
     SetData(_data.Settings.SettingOne, "Updated value one."); 
    } 

} 
+0

Est-ce que https://github.com/Fody/PropertyChanged aiderait? – mjwills

+0

Désolé, j'aurais dû mentionner que je n'ai aucun moyen d'installer ou d'utiliser des bibliothèques ou des paquets tiers en dehors de ce qui est déjà fourni. C'est un plugin pour un jeu qui fonctionne sur Unity. – user1960364

+0

Est-ce que https://docs.microsoft.com/en-us/dotnet/framework/winforms/how-to-implement-the-inotifypropertychanged-interface aide? – mjwills

Répondre

0

Tenir compte une approche comme:

public class SomePlugin 
{ 
    private DataObject _data; 
    private bool _dataIsDirty = false; 

    public bool IsDirty => _dataIsDirty || (_data?.IsDirty ?? false); 

    private class DataObject 
    { 
     private bool _dataIsDirty = false; 

     public bool IsDirty => _dataIsDirty || (Settings?.IsDirty ?? false); 
     public GeneralSettings Settings { get; set; } 
    } 

    private class GeneralSettings 
    { 
     public bool IsDirty { get; set; } 

     private string _settingOne; 

     public string SettingOne 
     { 
      get { return _settingOne; } 
      set 
      { 
       if (value != _settingOne) 
       { 
        IsDirty = true; 
        _settingOne = value; 
       } 
      } 
     } 

     public string SettingTwo { get; set; } // Won't mark as dirty 
    } 
} 

note en particulier que SettingOne a une logique dans son setter pour déterminer si vous souhaitez définir IsDirty ou non.