代码之家  ›  专栏  ›  技术社区  ›  Tigraine

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

  •  4
  • Tigraine  · 技术社区  · 16 年前

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

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

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

    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是否能够根据字段中的值实例化正确的对象。

    感觉不太对劲,我想我错过了什么。希望有人有更好的解决办法,我想不出一个。

    另外,如果你觉得合适的话,请重新标记这个问题,我现在想不出更有意义的标记了。

    5 回复  |  直到 16 年前
        1
  •  6
  •   Community Erin Dees    7 年前

    编辑:请注意,这里的代码可以通过让一个私有构造函数获取税率和名称来简化。我假设在现实生活中,税率之间可能存在实际的行为差异。

     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中的某种静态方法根据名称或其他任何内容返回正确的实例。

    正如评论中所指出的,它非常丑陋——或者至少当你有很多不同的价值观时,它会变得非常丑陋。分部类在这里有帮助:

    // 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 .

        2
  •  3
  •   Vilx-    16 年前

    我会这样做:

    public class TaxRate
    {
        public readonly string Name;
        public readonly decimal Rate;
    
        private TaxRate(string name, decimal rate)
        {
            this.Name = name;
            this.Rate = rate;
        }
    
    
        public static readonly TaxRate NormalRate = new TaxRate("Normal rate", 20);
        public static readonly TaxRate HighRate = new TaxRate("High rate", 80);
    }
    

    TaxRate 静态成员,如枚举值。要与NHibernate一起使用,您必须创建自己的自定义NHibernate类型类(请参阅文档),但这并不难。我已经做过一次了。

        3
  •  1
  •   Winston Smith    16 年前

    <appSettings>
        <add key="BaseTaxRate" value=20"/>
        <add key="HigherTaxRate" value=40"/>
    </appSettings>
    

    然后,您只需在应用程序中检索以下内容:

    string baseTaxRate = ConfigurationSettings.AppSettings["BaseTaxRate"];
    

    这样,它们很容易更改,并且不需要重新编译和部署应用程序。

        4
  •  1
  •   to StackOverflow    16 年前

    将速率存储在数据库(或其他持久性介质,如应用程序配置文件)中有什么问题?我原以为您希望每个税率都有一个唯一的Id,用于产品和税率之间的关系。

    因此,您将拥有一个Id为/Description/Rate(*)的TaxRate类。您可以加载包含所有可能值的字典,以便按Id快速查找速率/描述。

    (*)在多语言应用程序中,您需要从数据库的第二个表或资源等中查找每对区域性/Id的本地化描述。。。

    无论如何,硬性规定的税率似乎是错误的——特别是现在政府正在玩弄税率来提振经济。

        5
  •  1
  •   Troels Thomsen    16 年前

    虽然目前避免在数据库中保留增值税和税率似乎是一个合乎逻辑的决定,但时间会证明你错了。首先,您应该始终能够提取给定时间的数据,要做到这一点,您需要对速率进行版本控制。