枚举结构?一个行为类似Enum的Value对象

Tig*_*ine 4 c# enums

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

我有两种可以适用于我的产品的税收.我特别希望避免将Taxrates持久存储到数据库中,同时仍能在中心位置更改它们(如20%到19%的Taxrate等).

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

我可以使用映射到值的枚举.但是我必须创建一些方法来检索英语枚举值的该Taxrate的德语名称(我用英语编写代码,App是德语版).

我想过只使用硬编码的对象来反映这一点,

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; } }
}
Run Code Online (Sandbox Code Playgroud)

但后来我必须创建一些包含这两个对象的两个实例的列表.静态地做它可能有用,但我仍然需要保留某种列表.此外,我必须找到一种方法将我的POCO域对象映射到此,因为我怀疑NHibernate可以根据字段中的值实例化正确的对象.

它感觉不对,我觉得我在这里遗漏了一些东西.希望有人有更好的解决方案,我想不出一个.

问候,丹尼尔

Ps:如果你找到合适的东西,也请重新提出这个问题,我现在想不出更有意义的标签.

Jon*_*eet 6

编辑:请注意,这里的代码可以通过私有构造函数采取税率和名称轻松缩写.我假设在现实生活中,税率之间可能存在实际的行为差异.

听起来你想要像Java的枚举一样.

C#使得它相当棘手,但你可以在某种程度上使用私有构造函数和嵌套类来完成它:

 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; } }
     }
 }
Run Code Online (Sandbox Code Playgroud)

您可能希望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; } }
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用项目文件来显示嵌套类作为外部类的子项,如此SO问题所示.