C# 枚举结构?行为类似于枚举的值对象
我想知道你如何处理这个问题 我有两个税率可以适用于我的产品。我特别希望避免将税率持久化到数据库中,同时仍然能够在中心位置更改税率(如税率从20%更改为19%等) 所以我决定将它们编译到我的应用程序中(它是内部的)会很好。问题是,我不仅想知道税率,还想知道税率的名称 我可以使用映射到该值的枚举。但接下来我必须创建一些方法来检索该税率的德语名称,以获取英语enum值(我用英语编写代码,应用程序是用德语编写的) 我想用硬编码的对象来反映这一点C# 枚举结构?行为类似于枚举的值对象,c#,enums,C#,Enums,我想知道你如何处理这个问题 我有两个税率可以适用于我的产品。我特别希望避免将税率持久化到数据库中,同时仍然能够在中心位置更改税率(如税率从20%更改为19%等) 所以我决定将它们编译到我的应用程序中(它是内部的)会很好。问题是,我不仅想知道税率,还想知道税率的名称 我可以使用映射到该值的枚举。但接下来我必须创建一些方法来检索该税率的德语名称,以获取英语enum值(我用英语编写代码,应用程序是用德语编写的) 我想用硬编码的对象来反映这一点 public interface Taxrate {
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:如果你觉得合适,请重新标记这个问题,我现在想不出更有意义的标记。为什么不在应用程序配置中存储税率,例如在web.config或app.config文件中?这些是简单的XML文件,其中有一个名为的部分,您可以在其中使用键和值指定自定义参数。例如:
<appSettings>
<add key="BaseTaxRate" value=20"/>
<add key="HigherTaxRate" value=40"/>
</appSettings>
这样,它们很容易更改,并且不需要重新编译和部署应用程序
显然,您还可以将税率名称作为额外设置存储在配置文件中。编辑:请注意,这里的代码可以通过使用私有构造函数获取税率和名称来简化。我假设在现实生活中,税率之间可能存在实际的行为差异 听起来您需要类似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; } }
}
}
您可能需要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; } }
}
}
然后,您可以使用munge项目文件将嵌套类显示为外部类的子类,如所示。我将这样做:
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
静态成员,比如enum值。要与NHibernate一起使用,您必须创建自己的自定义NHibernate类型类(请参阅文档),但这并不难。我已经做过一次了。我必须说,我觉得使用嵌套类的想法有点奇怪,因为在我看来这是一个主流需求
将速率存储在数据库(或其他持久性介质,如应用程序配置文件)中有什么问题?我原以为您希望每个税率都有一个唯一的Id,用于产品和税率之间的关系
因此,您将拥有一个Id为/Description/Rate(*)的TaxRate类。您可以加载包含所有可能值的字典,以便按Id快速查找速率/描述
(*)在多语言应用程序中,您需要从数据库的第二个表或资源等中查找每对区域性/Id的本地化描述
无论如何,硬性规定的税率似乎是错误的——特别是现在政府正在玩弄税率来提振经济。我知道这与你问题的主要前提背道而驰,但我想谈谈这个问题 虽然目前避免在数据库中保留增值税和税率似乎是一个合乎逻辑的决定,但时间会证明你错了。首先,您应该始终能够提取给定时间的数据,要做到这一点,您需要对速率进行版本控制 正如我们所知,唯一不变的是变化。说利率会改变(他们会改变)。如果您无法访问源,则无法进行适当的维护。如果将税率从统一增值税拆分为不同的税率,则更新系统将更加困难
这个问题并不是什么大问题。自12月1日起,英国已将增值税从17.5%降至15%。许多人被旧软件困住,无法更新费率。请避免犯这个错误(将费率拆分到数据库中也会有很多其他改进)。尽管看起来很难看,但斯基特是对的。。。这是一个不错的解决方案:P我还将覆盖默认的转换过程,以便您可以从十进制转换为这些实例中的一个。顺便说一句:我只认为它很难看,因为它是重叠在一起的。编辑以注意将其分为部分类别的可能性。每个产品都有一个不同的税率应用于它。每个产品都需要在每个列表中显示该税率。有包含1000多种产品的列表,需要在其中显示税率。如果我必须从数据库中查找Taxrate,服务器将获得更多的负载。
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);
}