在设置 class A 的任意 属性 时,设置抽象 class B 的 属性 (继承自 class A)

On setting any property of class A, set property of abstract class B (which is inherited from class A)

public abstract class ANetworkedComponent
{
    public bool Dirty { get; set; } = false;
}
public class Collider: ANetworkedComponent
{
    public Vector2 Velocity { get; set; }
}

每次修改继承自 ANetworkedComponent 的 class 的 属性 时,我都需要将 Dirty 设置为 true。例如,当

var collider = new Collider();
collider.Velocity = new Vector(10, 10);

被执行,那么collider.Dirty应该设置为true.

手动修改属性不是一个选项,因为属性太多而且不是 DRY。还有其他选择吗?

您可以创建一个通用的 属性,里面有一个虚拟字段,它使用反射来更改内部 属性

集合上的脏标志

它看起来像是 DRY 违规,因为整个 class 你只有一个 Dirty 属性。如果每个 属性 都有一个单独的 IsPropertyDirty,您就不会说这是 DRY 违规。

最快的(执行time-wise),将是您自己编写的属性。但正如您所指出的,这是最耗费开发人员时间的,所以我只会在性能分析表明它时才这样做。

另一个快速选项是“面向方面的编程”。有一些 C# 库,如 PostSharp,允许您将 'aspects' 添加到 classes。例如,您可以在 class 上为您设置 PostSharp auto-implement INotifyPropertyChanged,然后您可以使用它来侦听 属性 更改并设置 Dirty。我相信你也可以添加你自己的方面来改变各种条件下的脏状态。

PostSharp 位于 class 个 AOP 库中,可在编译期间将代码编织到您的程序集中。通常,您使用属性装饰 classes、属性和方法,这会告诉 PostSharp 在您的代码中自动实现哪些行为。还有一些库支持运行时方面(许多 IOC 容器支持这一点),虽然性能无法与代码生成的 AOP 相媲美,但它们非常有用。