Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在属性对象内更改(嵌套)属性时调用属性设置器_C#_.net_Properties - Fatal编程技术网

C# 在属性对象内更改(嵌套)属性时调用属性设置器

C# 在属性对象内更改(嵌套)属性时调用属性设置器,c#,.net,properties,C#,.net,Properties,疯狂的头衔。我知道。但是请容忍我 考虑以下情况: a.ClassProperty.ValueProperty = 4; 其中: class A { [...] public PropertyClass ClassProperty { get { return new PropertyClass(m_someInformation); } set { ComplexMultistepSetInformation(m_someInformat

疯狂的头衔。我知道。但是请容忍我

考虑以下情况:

a.ClassProperty.ValueProperty = 4;
其中:

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

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

PropertyClass tmp = a.ClassProperty;
tmp.ValueProperty = 4;
a.ClassProperty = tmp;
是否有任何方法可以改变周围的getter和setter来完成它

(附加信息:在类a中拥有PropertyClass对象不会有帮助。在实际用例中,PropertyClass是本机代码的包装器,简化了对变量的访问并提供了几个扩展方法,而本机对象的信息由属性“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;
}
void ModifyClassProperty(操作)
{
var tmp=类别属性;
行动(tmp);
ClassProperty=tmp;
}
void ModifyClassProperty(Action<PropertyClass> action)
{
    var tmp = ClassProperty;
    action(tmp);
    ClassProperty = tmp;
}