在更改属性对象中的(嵌套)属性时调用属性设置器

本文关键字:属性 调用 嵌套 设置 对象 | 更新日期: 2023-09-27 18:03:05

疯狂的标题。我知道。但请耐心听我说。

考虑以下情况:

a.ClassProperty.ValueProperty = 4;

地点:

class A
{
    [...]
    public PropertyClass ClassProperty
    {
        get { return new PropertyClass(m_someInformation); }
        set { ComplexMultistepSetInformation(m_someInformation); }
    }
    [...]
}

:

class PropertyClass
{
    [...]
    public int ValueProperty { get; set; }
    [...]
}

我的问题:当执行第一个给定的语句代码将返回一个PropertyClass对象,并改变其中的'ValueProperty',但信息本身为'a'将保持不变。
我想要的是'ClassProperty'的setter被调用,在改变通过'ClassProperty' getter检索的PropertyClass对象的信息后。意思是,一种使第一行完成以下任务的方法:

PropertyClass tmp = a.ClassProperty;
tmp.ValueProperty = 4;
a.ClassProperty = tmp;

是否有办法改变周围的getter和setter来完成它?

附加信息:在类a中拥有PropertyClass对象是没有帮助的。在实际用例中,PropertyClass是本机代码的包装器,简化了对变量的访问并提供了几个扩展方法,而本机对象的信息由属性的setter (ClassProperty)"写入"

在更改属性对象中的(嵌套)属性时调用属性设置器

是否有办法改变周围的getter和setter来完成它?

不,不完全是。代码:

a.ClassProperty.ValueProperty = 4;

可以简单地翻译成:

var tmp = a.ClassProperty;
tmp.ValueProperty = 4;

永远不会尝试调用a.ClassProperty setter。

你可能想改成这样:

a.ModifyClassProperty(x => x.ValueProperty = 4);

ModifyClassProperty的有效作用:

  • 应用用户提供的委托
  • 执行将更改应用于底层数据的任何步骤

例如,您可以使用当前代码实现它:

void ModifyClassProperty(Action<PropertyClass> action)
{
    var tmp = ClassProperty;
    action(tmp);
    ClassProperty = tmp;
}