C# 是否可以知道对象属性何时更改?
无论何时更改结构或对象属性,我都需要进行控制。它没有我可以使用的任何事件 示例:如何知道宽度或高度何时更改?这可能吗 “System.Drawing.Size=尺寸”C# 是否可以知道对象属性何时更改?,c#,properties,C#,Properties,无论何时更改结构或对象属性,我都需要进行控制。它没有我可以使用的任何事件 示例:如何知道宽度或高度何时更改?这可能吗 “System.Drawing.Size=尺寸” 对于这种特定的情况,如果大小属性是只读的,那么问题将得到解决。但它们不是。在意识到它是一个结构后编辑: 以Eric Lippert在其博客中关于可变结构的精彩文章为例 看看 和根据评论编辑: 示例:如何知道宽度或高度何时更改?这可能吗 不,这是不可能的。然而,这并不重要 当您从类中返回大小时,因为,您返回的是一份副本。即使用户更
对于这种特定的情况,如果大小属性是只读的,那么问题将得到解决。但它们不是。在意识到它是一个结构后编辑: 以Eric Lippert在其博客中关于可变结构的精彩文章为例 看看
和根据评论编辑: 示例:如何知道宽度或高度何时更改?这可能吗 不,这是不可能的。然而,这并不重要 当您从类中返回
大小时,因为,您返回的是一份副本。即使用户更改您返回的大小的宽度
或高度
,也不会影响类中的mySize
结构
为了改变你的尺寸,他们需要改变整个东西,即:
var temp = yourClass.MySize;
temp.Width = newWidth;
yourClass.MySize = temp; // The user will need to assign an entire Size
就您而言,Size
属性实际上是只读的,因为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
}
}
另一个选项是在属性设置器中重新计算宽度和高度的大小:
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
事件,如果它是适当的属性,则重新计算您的大小。简短回答-不,当字段更改时,不会在普通的旧C#对象上触发任何事件
我知道你的选择:
- 将您的类(如果可以)更改为激发事件
- 从类继承并在派生类中编写事件触发代码(假设可以使用虚拟get/set)
- 将属性提取到接口中,在整个代码中使用该接口,并为触发属性更改的通用接口构建包装器
请注意-尽量避免“每当struct
属性更改时”这种情况。您可以创建一个事件,并使用适当的Set方法引发它。或者,您可以检查此链接,其中有两个示例:
您可以在那里创建自己的活动。NET有一个OnPropertyChanged
事件,您可以将其用作基础。Size是您的类还是来自框架?您可能需要使用@cadrell0,Size是来自的结构。NET@GarrisonNeely是的,我知道。但是大小是一个结构,它没有属性更改事件。所以,如果有人改变宽度或高度,我的班级将不会意识到。是的,我知道。但是Size是一个结构,它没有实现这个接口。所以,如果有人更改宽度或高度,我的类将不会意识到。框架本身不提供这样的选项,您必须实现一个。如果有人更改宽度或高度,我的类将不会意识到。这就是问题所在。@Pedro77宽度和高度也是你们班的一部分吗?如果是这样的话,只需将它们设置为属性,它们更改它的唯一方法就是让您知道它…不,它们是.NET大小结构的一部分。@Pedro77用户不能直接在您的大小上设置宽度和高度-大小是一个结构,这意味着您的属性将返回一个副本,因此他们无法更改宽度和高度。解决方案是创建一个新的大小类,如“class MySize”,它在属性更改时实现事件。它不可能使用旧的尺寸结构,因为宽度或高度可以在我的课堂之外改变。我希望有一个解决这个问题的办法。