是否可以知道对象属性何时发生了变化?

时间:2013-07-16 16:34:38

标签: c# properties

每当更改struct或object属性时,我都需要控制。它没有我可以使用的任何事件。

示例:如何知道宽度或高度何时发生变化?这甚至可能吗?

“System.Drawing.Size = Size”

    private Size mySize;

    public Size MySize
    {
        get {
            //What if X or Y is changed?? I need to know that
            return mySize; 
        }
        set {

            mySize = value; 
        }
    }

对于这种特定情况,如果只读取Size属性,则问题将得到解决。但他们不是。

4 个答案:

答案 0 :(得分:4)

编辑以回应评论:

  

示例:如何知道宽度或高度何时发生变化?这甚至可能吗?

不,这是不可能的。但是,没关系。

当您从班级返回Size时,自Size is a struct起,您就会返回副本。即使用户更改了您返回的Width的{​​{1}}或Height,也不会影响您班级中的Size结构。

为了改变你的尺寸,他们需要改变整个事物,即:

mySize

就您而言,var temp = yourClass.MySize; temp.Width = newWidth; yourClass.MySize = temp; // The user will need to assign an entire Size 属性实际上是只读的,因为Size是值类型。


原始答案,假设Width和Height是用户类的属性:

有两个主要选项 -

您可以根据宽度和高度动态计算尺寸,而不是存储尺寸:

System.Drawing.Size

另一种选择是在属性设置器中为宽度和高度重新计算您的大小:

public Size MySize
{
    get {            
        return new Size(Width,Height); 
    }
    set {
        Width = value.Width; 
        Height = value.Height; // Set Width/Height appropriately
    }
}

最后,如果您使用public double Width { get { return width; } set { width = value; mySize = new Size(width, Height); // Compute new size, so it's always correct } } 之类的内容来跟踪更改,您还可以订阅自己的INotifyPropertyChanged事件,如果它是相应的属性,请重新计算您的尺寸。

答案 1 :(得分:3)

简短回答 - 不,在字段更改时触发的普通旧C#对象上没有事件。

我知道你的选择:

  • 更改您的课程(如果可以)以解雇活动
  • 从您的类继承并在派生类中编写事件触发代码(假设可以进行虚拟get / set)
  • 将属性提取到接口中,在整个代码中使用该接口,并为触发属性更改的通用接口构建包装器。

请注意mutable struct considered evil - 尽量避免“只要struct属性发生更改”这一情况。

答案 2 :(得分:1)

编辑在意识到它是一个结构:

考虑Eric Lippert在他的博客中关于Mutable Structs的精彩文章 Mutating Readonly Structs(Evil)

查看INotifyPropertyChanged Interface

INotifyPropertyChanging Interface

答案 3 :(得分:1)

您可以创建一个事件并在适当的Set方法中引发它。或者你可以查看这个链接,有两个例子:

Raise an event whenever a property's value changed?