如果只有一个 属性 发生变化,.Net C# 中来自客户 class 的单例 Setter 不会触发

Setter of a singleton from an custome class in .Net C# not triggered if only one property changed

我有这个class

 public class SPP {

    static PPModel PP= null;

    public PPModel sPP
    {
        set
        {
            if (PP != value)
            {
               PP = value;
               //save PP in database
            }
        }
        get
        {

            if (PP == null)
            {
                //lazy loading of PP
            }
            return PP;
        }
    }
}

public class PPModel
{
    public string property1 { get; set; }
    public int property2 { get; set; }
    public int property3 { get; set; }
    public int property4 { get; set; }
    public Dictionary<string, int> property5 { get; set; }
}

现在如果我这样设置 sPP,一切正常:

SSP.Instance.sPP = new PPModel(){...};

但我想知道是否可以仅更新此单例中的一个 属性 并以这种方式触发 setter:

SSP.Instance.sPP.property4 = 7;

如果我这样做,单例 sPP 具有更新的值,但是 setter 似乎没有被触发,这意味着像数据库保存这样的附加代码将不起作用。

有没有机会让这个工作?

提前致谢。

一个好的解决方案是更改模型以具有完整的属性定义,并在设置器上调用数据库更新,如下所示:

public class PPModel
{
    private string _fieldOne;

    public string Property1
    {
        get { return _fieldOne; }
        set
        {
            _fieldOne = value;
            // update DB
        }
    }

    private int _field2;

    public int Property2
    {
        get { return _field2; }
        set
        {
            _field2 = value;
            // update DB
        }
    }

    // and so on for all properties
}

您无法通过更新内部存储的对象属性在单例中触发 setter。

您可以像这样触发您的 setter:

SSP.Instance.sPP = new PPModel(){...};
var instance = SSP.Instance.sPP;
instance.property4 = 7
SSP.Instance = instance;

这样您就可以将确切的变量重置为您的实例并触发更新。

但是,当您实现单例时,它不负责执行与其存储的对象相关的操作。 您必须监视 PPModel 对象的变化,因为只有这个 class 负责它的内部状态。