【问题标题】:Method To Set Nested Property Value设置嵌套属性值的方法
【发布时间】:2017-08-18 11:38:17
【问题描述】:

我正在为一个要求所有代码都在一个类(或嵌套类)中的软件编写插件...

我想要做的是创建一个方法,该方法可以处理对我的_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.");
    }

}

【问题讨论】:

  • 对不起,我应该提到除了已经提供的之外,我无法安装或使用任何第三方库或包。这是一个在 Unity 上运行的游戏的插件。
  • 看起来很有趣,但我不知道它是否可行,也不知道如何尝试在我的结构中实现它。您一直在建议这些基于事件的解决方案...这是因为无法进行类似于我编写的伪方法的实现吗?
  • 您可以将[JsonIgnore] 放在IsDirty 上,这样它就不会“污染”JSON。

标签: c# mono nested-properties


【解决方案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 的逻辑。

【讨论】:

    猜你喜欢
    • 2010-11-05
    • 1970-01-01
    • 2019-04-18
    • 1970-01-01
    • 2013-12-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-25
    • 1970-01-01
    相关资源
    最近更新 更多