gpt4 book ai didi

c# - 在 C# 中使用默认引用对象关系访问属性的默认值

转载 作者:行者123 更新时间:2023-11-30 12:11:04 24 4
gpt4 key购买 nike

我在层次结构中有一个对象,其值可以默认为父对象的值。两个对象属于同一类型。

例如:如果 Score 属性是 double.NaN,那么 Score 值应该从Parent 属性指向,但前提是设置了 Parent (Parent != null)。

我的问题是,我怎样才能以一种通用的方式可靠地实现这样一个模型?我有 2 个选项,但也许还有更多?

选项 1: 更改每个属性的 getter 和 setter 以检查正在设置或获取的属性是否具有默认值,如果是,则尝试从父级读取它

    private double score = double.NaN;
public double Score
{
get { return (score == double.NaN && Parent != null) ? Parent.Score : score; }
set { score = (Parent != null && Parent.Score == value) ? double.NaN : value; }
}

优点:

  • 分别对所有属性值进行实时原子更新
  • 默认值的明确比较

缺点:

  • 每个属性的getter和setter都需要手动实现,容易出错
  • 每次获取和设置都会影响性能

选项 2:在对象加载和保存时实现默认

    void AfterLoad()
{
if(Parent != null)
{
if(score == double.NaN)
{
score = Parent.Score;
}
// (...)
}
}

void BeforeSave()
{
if(Parent != null)
{
if(score == Parent.Score)
{
score = double.NaN;
}
// (...)
}
}

void AfterSave()
{
AfterLoad();
}

优点:

  • 仅在加载(一次)和保存(两次)时使用父关系以提高性能

缺点:

  • 任何时候父对象的改变都不会影响子属性

  • 在更改父对象之前和之后,需要处理子对象(以在父对象更改后回退到新的默认值)

  • 原子性会受到影响 - 在保存期间对象不能被任何其他线程访问

我相信很多人在实现对象“样式化”模型时都遇到过类似的困境。我正在寻找一个干净且有效的解决方案,它也可以将子对象和父对象的集合连接在一起(使用 CompositeCollection ?)。

最佳答案

您可以使用 WPF 风格的方法,其中属性值不是存储在字段中,而是存储在基类的字典中。

这样所有的属性看起来都像

double Prop {
get{ return (double)GetValue("Prop"); }
set{ SetValue("Prop",value); }
}

如果未为当前类设置默认值,GetValue 将检查所有父级以找到默认值。

关于c# - 在 C# 中使用默认引用对象关系访问属性的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16279733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com