我有一个代表银行账户的标准C#枚举:
public enum Accounts
{
BankOfAmerica = 123654,
BankOfIndia = 765091
}
此枚举在我的代码中的许多地方使用。某些对象使用它将帐号用作字符串(“123654”),整数(123654)或帐户名称作为字符串(“BankOfAmerica”)。
帐号更改,它们也包含数字,因此我不能简单地更改枚举...
有人能指出一种方法,使这种变化尽可能轻松,代码中的变化次数最少吗?
我想用一个包含帐户名和值的单例类来替换枚举,但是为了用新类替换旧枚举的用法,需要进行许多代码更改。
答案 0 :(得分:8)
帐号已更改,并且还包含数字......
那时你正在使用错误的工具。枚举类型的值应在编译时定义。如果帐号发生变化,那么您应该使用更高级的类型(即类)来允许变异(如果需要)以及更高级的UI层格式。
答案 1 :(得分:4)
Ed S.是正确的;枚举是错误的工具。详细说明他的答案:
枚举值是常量,并且常量必须在所有时间,过去,现在和未来逻辑上保持不变。如果枚举值可能随着时间的推移而改变,而含义没有改变,那么它首先不应该是枚举或常量。
同样,如果枚举中的一组事物可能会随着时间的推移而改变,即使它们的值保持不变,那么枚举也许是一个坏主意。你不希望遇到这种情况:
enum Banks
{
BankOfFoo,
BankOfBar,
BankOfBlah,
BankOfABC
}
然后下一个版本,Bank Of Foo已经收购了Bar of Bar,Bank of Blah已经停业,Bank of ABC已将其名称更改为DEF银行,并且已经成立了一个全新的Bank of XYZ。 / p>
枚举是用于表示随时间变化的内容的错误机制。你不应该为此使用枚举,也不应该使用const字符串。
答案 2 :(得分:3)
var accounts = new Dictionary<string,string>();
accounts.Add("Bank of America", "ABC12345");
accounts.Add("Bank of India", "122-6X-666");
string number = accounts["Bank of America"];
或者,如果您更喜欢坚持枚举:
public enum Accounts {
BankOfAmerica,
BankOfIndia
}
var accounts = new Dictionary<Accounts,string>();
accounts.Add(Accounts.BankOfAmerica, "ABC12345");
accounts.Add(Accounts.BankOfIndia, "122-6X-666");
string number = accounts[Accounts.BankOfAmerica];
答案 3 :(得分:1)
最好使用BankAccount的类,如下所示:
public class BankAccount
{
public string Name { get; set; }
public int Number { get; set;}
public BankAccount(string name, int number)
{
Name = name;
Number = number;
}
}
然后将实际帐户保存在集合中,例如List:
public List<BankAccount> BankAccounts = new List<BankAccount>();
然后,您可以通过编号或名称轻松搜索银行帐户,或者使用循环或LINQ轻松搜索任何属性:
public BankAccount GetAccountByName(string name)
{
return BankAccounts.FirstOrDefault(a => a.Name == name);
}
当您找到想要更改的BankAccount对象时,只需更改属性即可:
var account = GetAccountByName("BankOfAmerica");
account.Number = 12345678;
或者通过创建一个为您执行此操作的方法。枚举不是这种方式;它们是必须在编译时定义的常量集合,并不打算进行更改。即使你需要花费大量的时间来实现这样的改变,但从长远来看它是值得的,只会让事情变得更容易。
答案 4 :(得分:0)
为什么不使用属性?
class AccountAttribute : Attribute
{
public string MyValue { get; set; }
// add any other stuff...
}
public enum Accounts
{
[Account(MyValue = "A")]
BankOfAmerica = 123654,
[Account(MyValue = "B")]
BankOfIndia = 765091
}
之后,您只需使用stadard reflexion在您的字段中获取自定义属性。
答案 5 :(得分:0)
我认为这些答案中的任何一个都不能正确解决这个问题。这里真正需要的是一个数据库来存储这些随时间变化的数据。尝试在代码中存储更改的数据通常是个坏主意,因为每次数据更改时都需要重新编译。
包含 AccountId , AccountName (以及可能需要存储的其他数据)列的数据库表绝对是最强大的解决方案。如果这只是一个快速而又脏的应用程序,它甚至不需要是一个完整的数据库,像SQLite或SQL Server Express这样的东西可以工作。
然后,您可以通过ADO .NET代码或您选择的Object-Relational-Mapper访问此表。