在枚举中使用字符串

时间:2011-12-12 21:56:58

标签: c# .net enums

我有一个代表银行账户的标准C#枚举:

public enum Accounts
{
    BankOfAmerica = 123654,
    BankOfIndia = 765091
}

此枚举在我的代码中的许多地方使用。某些对象使用它将帐号用作字符串(“123654”),整数(123654)或帐户名称作为字符串(“BankOfAmerica”)。

帐号更改,它们也包含数字,因此我不能简单地更改枚举...

有人能指出一种方法,使这种变化尽可能轻松,代码中的变化次数最少吗?

我想用一个包含帐户名和值的单例类来替换枚举,但是为了用新类替换旧枚举的用法,需要进行许多代码更改。

6 个答案:

答案 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访问此表。