gpt4 book ai didi

c# - 枚举结构?行为类似于枚举的值对象

转载 作者:太空狗 更新时间:2023-10-30 00:13:24 25 4
gpt4 key购买 nike

我想知道你会如何解决这个问题

我有两种适用于我的产品的税率。我特别想避免将税率保存到数据库中,同时仍然能够在一个中心位置更改它们(比如税率从 20% 到 19% 等)。

所以我决定将它们编译到我的应用程序中(它是内部应用程序)会很棒。问题是我不仅想知道税率,还想知道税率的名称。

我可以使用映射到值的枚举。但是我必须创建一些方法来检索英语枚举值的税率的德语名称(我用英语编写代码,应用程序是德语)。

我考虑过使用硬编码对象来反射(reflect)这一点,

public interface Taxrate
{
string Name { get; }
decimal Rate { get; }
}

public class NormalTaxRate : Taxrate
{
public string Name
{ get { return "Regelsteuersatz"; } }

public decimal Rate
{ get { return 20m; } }
}

但是我必须创建某种列表来保存这两个对象的两个实例。静态执行可能有效,但我仍然必须保留某种列表。此外,我还必须找到一种方法将我的 POCO 域对象映射到此,因为我怀疑 NHibernate 能否根据字段中的值实例化正确的对象。

感觉不太对劲,我觉得我漏掉了什么。希望有人有更好的解决方案,我想不出一个。

问候,丹尼尔

Ps:如果您发现合适的东西,也请重新标记这个问题,我现在想不出更有意义的标记。

最佳答案

编辑:请注意,这里的代码可以很容易地通过让私有(private)构造函数采用税率和名称来缩写。我假设在现实生活中,税率之间可能存在实际行为差异。

听起来您想要类似 Java 枚举的东西。

C# 使这变得相当棘手,但您可以在某种程度上使用私有(private)构造函数和嵌套类来做到这一点:

 public abstract class TaxRate
{
public static readonly TaxRate Normal = new NormalTaxRate();
public static readonly TaxRate Whatever = new OtherTaxRate();

// Only allow nested classes to derive from this - and we trust those!
private TaxRate() {}

public abstract string Name { get; }
public abstract decimal Rate { get; }

private class NormalTaxRate : TaxRate
{
public override string Name { get { return "Regelsteuersatz"; } }
public override decimal Rate { get { return 20m; } }
}

private class OtherTaxRate : TaxRate
{
public override string Name { get { return "Something else"; } }
public override decimal Rate { get { return 120m; } }
}
}

您可能需要 TaxRate 中的某种静态方法来根据名称或其他内容返回正确的实例。

我不知道这与 NHibernate 的配合有多容易,但希望它能在某种程度上有所帮助......

如评论中所述,它非常难看 - 或者至少当您有很多不同的值时会变得非常难看。局部类可以提供帮助:

// TaxRate.cs
public partial abstract class TaxRate
{
// All the stuff apart from the nested classes
}

// TaxRate.Normal.cs
public partial abstract class TaxRate
{
private class NormalTaxRate : TaxRate
{
public override string Name { get { return "Regelsteuersatz"; } }
public override decimal Rate { get { return 20m; } }
}
}

// TaxRate.Other.cs
public partial abstract class TaxRate
{
private class OtherTaxRate : TaxRate
{
public override string Name { get { return "Something else"; } }
public override decimal Rate { get { return 120m; } }
}
}

然后您可以修改项目文件以将嵌套类显示为外部类的子类,如 this SO question 所示。 .

关于c# - 枚举结构?行为类似于枚举的值对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/325511/

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