Метод для установки значения вложенного свойства
Я пишу плагин для части программного обеспечения, которая требует, чтобы весь код был в одном классе (или вложенных классах)...
То, что я хочу сделать, это создать метод, который может обрабатывать изменения вложенных свойств моего _data
возражать и дать мне центральное место для таких вещей, как установка грязного флага, чтобы я знал, чтобы сохранить его позже.
Ниже приведен код, иллюстрирующий структуру моего файла, а внизу два псевдо-метода, которые, надеюсь, могут дать вам представление о том, чего я пытаюсь достичь.
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.");
}
}
1 ответ
Рассмотрим такой подход, как:
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
}
}
Обратите внимание, в частности, что SettingOne
имеет логику в своем установщике, чтобы определить, нужно ли устанавливать IsDirty
или нет.