修改成员时不调用 C# 对象设置器 [英] C# Object Setter Not Called When Member is Modified

查看:37
本文介绍了修改成员时不调用 C# 对象设置器的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有以下包装类:

public class Wrapper
{
    public int Member;
}

在一个单独的类中,我有以下内容:

In a separate class, I have the following:

public class ContainerClass
{
    private Wrapper data;
    public Wrapper Property
    {
        get { return data; }
        set { data = value; }
    }

    public void Foo()
    {
        Property.Member = 42;
    }
}

Property.MemberFoo() 中被修改时,什么都不会发生(setter 被跳过).但是,我仍然可以执行以下操作,例如:

When Property.Member is modified in Foo(), nothing happens (the setter is skipped). However, I can still do the following, for example:

    public void Foo()
    {
        Property = Property;
    }

并输入所需的设置器.所以我的问题是,为什么不修改对象属性的成员调用该属性的 setter?

and enter the desired setter. So my question is, why doesn't modifying the member of an object property call that property's setter?

推荐答案

因为您没有设置 Property 的值.您的代码只是调用 Property 的 getter,然后设置 Member 字段的值(如果它是一个属性,这里不是这种情况).

Because you aren't setting the value of Property. Your code just invokes the getter of Property, then setting the value of the Member field (which would invoke the setter of Member if it were a property, which isn't the case here).

如果要在设置Member时执行代码,需要有

If you want to execute code when Member is set, you need to have

public class Wrapper
{
    private int member;
    public int Member
    {
        get { return this.member; }
        set 
        {
            this.member = value;
            DoSomething();
        }
    }
}

<小时>

或者更优雅的解决方案是使用事件.内置的 INotifyProperyChanged 界面为您提供了一个非常好的模板东西.


Or perhaps a more elegant solution would be to use events. The built-in INotifyProperyChanged interface gives you a pretty good template for this sort of thing.

using System.ComponentModel;

public class Wrapper : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    private int member;
    public int Member
    {
        get { return this.member; }
        set 
        {
            this.member = value;
            this.OnPropertyChanged("Member");
        }
    }

    protected void OnPropertyChanged(string name)
    {
      PropertyChangedEventHandler handler = PropertyChanged;
      if (handler != null)
      {
          handler(this, new PropertyChangedEventArgs(name));
      }
    }
}

public class ContainerClass
{
    private Wrapper data;
    public Wrapper Property
    {
        get { return data; }
        set { data = value; }
    }

    public void Foo()
    {
        data.PropertyChanged += data_PropertyChanged;
        Property.Member = 42;
    }

    private void data_PropertyChanged(object sender, PropertyChangedEventArgs e)
    {
        if (e.PropertyName == "Member")
        {
            DoStuff();
        }
    }
}

这篇关于修改成员时不调用 C# 对象设置器的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆