我有一个可能值的枚举:
public enum Language
{
English = 1,
French = 2,
German = 3
}
现在我希望我的课程能够动态,因为它可以根据枚举列表来满足多个值。因此,如果枚举列表增长,我可以捕获所有可能的值。
以下是我的初始设计的外观:
public class Locale
{
public string EnglishValue { get; set; }
public string FrenchValue { get; set; }
public string GermanValue { get; set; }
}
但是如果枚举列表(或任何列表)增长,我想要一些不需要重新编译的东西:是否有可能表达如下内容:
public class Locale
{
public string StringValue<T> Where T : Language
}
我对任何可以很好地处理这个问题的建议或设计模式持开放态度。 感谢
答案 0 :(得分:1)
只需使用字典。
public class Locale : Dictionary<Language, string>
{
}
无论你做什么,如果你改变枚举,你必须重新编译,但你可能意味着“维护”Locale类。
答案 1 :(得分:0)
不幸的是,你提出的建议是行不通的。这将是一个更好的设计恕我直言:
public class Locale
{
public string GetStringValue(Language language)
{
// return value as appropriate
}
}
答案 2 :(得分:0)
通用参数是类型参数,而不是值参数,枚举成员(至少在C#中)是不同的值,而不是类型。枚举(在本例中为语言)确实是一种类型,但不是其成员。
此外,泛型类将知道它有一个继承自Language的类型参数,但由于枚举不能在C#中继承,这和泛型类型参数约束(“其中T:Langauge”的东西)在一起几乎意味着泛型类型参数在所有情况下都将始终为“语言”,因此在这种情况下没有必要使用泛型类。如果我是你,我会这样做:
public class Locale
{
public string GetStringValue(Language language)
{
// ...
}
}
答案 3 :(得分:0)
也许最好让Language成为一个类,并像System.Globalization.CultureInfo一样填充一些特定于语言的处理?
答案 4 :(得分:0)
虽然我同意其他答案,但您当然可以使用Dictionary for the Language列表,然后在运行时从本地配置或数据库填充它,为您提供可扩展性,而无需重新编译。