2

我需要控制结构或对象属性何时更改。它没有任何我可以使用的事件。

示例:我如何知道宽度或高度何时更改?这甚至可能吗?

“System.Drawing.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

4 回答 4

4

根据评论进行编辑:

示例:我如何知道宽度或高度何时更改?这甚至可能吗?

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

当您Size从班级返回 a 时,因为Size是 astruct,所以您正在返回一个副本。即使用户更改了您返回的Widthor ,它也不会影响您类中的结构。HeightSizemySize

为了改变你的大小,他们需要改变整个事情,即:

var temp = yourClass.MySize;
temp.Width = newWidth;
yourClass.MySize = temp; // The user will need to assign an entire Size

就您而言,Size属性实际上是只读的,因为System.Drawing.Size它是一种值类型。


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

有两个主要选项 -

您可以根据您的宽度和高度即时计算大小,而不是存储它:

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跟踪更改之类的东西,您还可以订阅自己的PropertyChanged事件,如果它是适当的属性,请重新计算您的大小。

于 2013-07-16T16:42:22.170 回答
3

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

我知道的你的选择:

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

请注意,可变结构被认为是邪恶的 - 尝试完全避免“每当struct属性更改时”的情况。

于 2013-07-16T16:45:55.597 回答
1

您可以创建一个事件并在适当的 Set 方法中引发它。或者,您可以查看此链接,其中包含两个示例:

每当属性值发生变化时引发事件?

于 2013-07-16T17:00:37.460 回答
1

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

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

看看INotifyPropertyChanged 接口

INotifyPropertyChanging 接口

于 2013-07-16T16:41:01.147 回答