我想知道你将如何解决这个问题
我有两种可以适用于我的产品的税收.我特别希望避免将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:如果你找到合适的东西,也请重新提出这个问题,我现在想不出更有意义的标签.
编辑:请注意,这里的代码可以通过私有构造函数采取税率和名称轻松缩写.我假设在现实生活中,税率之间可能存在实际的行为差异.
听起来你想要像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问题所示.