在更改属性对象中的(嵌套)属性时调用属性设置器
本文关键字:属性 调用 嵌套 设置 对象 | 更新日期: 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;
}