gpt4 book ai didi

c# - 如何在 C# 中创建互斥属性

转载 作者:行者123 更新时间:2023-11-30 14:28:32 26 4
gpt4 key购买 nike

我有一个具有三个属性的类:

class PriceCondition
{
public Product SalesCode {...}
public ControlDate Condition {...}
public PriceDetail Pricing {...}
}

PriceCondition 的任何实例只能有一个SalesCodeCondition .如果Condition被选中,那么 Pricing是必需的,但这与本次讨论无关。

作为一个相对较差的程序员,我最初尝试了以下方法:

    public Product SalesCode
{
get { return _salesCode; }
set
{
this.Condition = null;
_salesCode = value;
}
}

public ControlDate Condition
{
get { return _cond; }
set
{
this.SalesCode = null;
_cond = value;
}
}

事后看来,造成堆栈溢出的原因显而易见。寻找正确的方法,我找到了this SO answer about XORing a List ,但我无法弄清楚如何将其应用于我正在尝试做的事情,因为 Except是一个 IEnumerable方法,我没有使用 List<T>或任何类似的东西。

如何确保在任何时候只设置其中一个属性?我可以传入 var CodeOrCondition 吗?作为构造函数中的参数,使用 typeof弄清楚它是什么,然后适本地分配它?我只是有点理解我刚才说的内容,所以在我开始编写代码之前先了解一下它是否会起作用会很有帮助。

更新:

在答案中找到出色的帮助后,我得到了这个:

public class PriceCondition
{
#region Constructor
/// <summary>Create an empty PriceCondition.
/// </summary>
/// <remarks>An empty constructor is required for EntityFramework.</remarks>
public PriceCondition();

/// <summary>Create a PriceCondition that uses a Sales Code.
/// </summary>
/// <param name="salesCode">The Product to use.</param>
public PriceCondition(Product salesCode)
{
SalesCode = salesCode;
Condition = null;
Pricing = null;
}

/// <summary>Create a PriceCondition that uses a DateControl and Price (e.g. "0D7")
/// </summary>
/// <param name="dateControl">The DateControl Condition to use.</param>
/// <param name="price">The PriceDetail to use.</param>
public PriceCondition(Condition dateControl, PriceDetail price)
{
SalesCode = null;
Condition = dateControl;
Pricing = price;
}
#endregion
....
}

第二次更新:

EntityFramework 妨碍了我。我知道它需要空的构造函数,但没有意识到原因的深度。我们发现使用 private set正在阻止 EF 从数据库中填充对象。至少看起来是这样。我们将数据保存在我们的 DBInitializer 中,但信息没有加载到 PriceCondition 中当我们尝试使用它时。简单的答案似乎是将 setter 放回标准的后备存储方法,并依赖业务逻辑层永远不会设置 SalesCode。和一个 ControlDate同样PriceCondition .但现在这也不管用了。我们会继续努力,但我们将不胜感激任何建议。

最佳答案

设置支持变量而不是属性:

public Product SalesCode
{
get { return _salesCode; }
set
{
_cond = null;
_salesCode = value;
}
}

public ControlDate Condition
{
get { return _cond; }
set
{
_salesCode = null;
_cond = value;
}
}

我个人更喜欢的另一种方法是制作一个不可变对象(immutable对象),并为可能的配置提供构造函数:

class PriceCondition {

public Product SalesCode { get; private set; }
public ControlDate Condition { get; private set; }
public PriceDetail Pricing { get; private set; }

public PriceCondition(Product salesCode) {
SalesCode = salesCode;
Condition = null;
Pricing = null;
}

public PriceCondition(ControlDate condition, PriceDetail pricing) {
SalesCode = null;
Condition = condition;
Pricing = pricing;
}

}

(你也应该验证构造函数中的参数,但这说明了原理。)

关于c# - 如何在 C# 中创建互斥属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29377126/

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