在设置 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 相媲美,但它们非常有用。
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 相媲美,但它们非常有用。