Использование строк в перечислении - PullRequest
3 голосов
/ 13 декабря 2011

У меня есть стандартное перечисление C #, представляющее банковские счета:

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

Это перечисление используется во многих местах в моем коде.Некоторые объекты используют его для использования номера счета в виде строки («123654»), целого числа (123654) или имени счета в виде строки («BankOfAmerica»).

Номер счета изменяется иони также содержат цифры, поэтому я не могу просто изменить перечисление ...

Может ли кто-нибудь указать способ сделать это изменение максимально безболезненным с минимальным количеством изменений в коде?

Я думал о замене перечисления одноэлементным классом, содержащим имена и значения учетных записей, но затем потребовалось много изменений кода, чтобы заменить использование старого перечисления новым классом.

Ответы [ 6 ]

8 голосов
/ 13 декабря 2011

Номер счета изменился, и он также содержит цифры ...

Тогда вы используете не тот инструмент для работы.Значения перечислимого типа должны быть определены во время компиляции.Если номера счетов меняются, вам следует использовать более продвинутый тип (т. Е. Класс), который позволит выполнять мутации (при необходимости), а также более сложное форматирование для уровня пользовательского интерфейса.

4 голосов
/ 13 декабря 2011

Эд С. прав;Перечисление является неправильным инструментом для работы.Чтобы уточнить его ответ:

Значения Enum равны константы , а константы должны быть логически постоянными для всего времени, прошлого, настоящего и будущего .Если значение enum может меняться со временем без изменения , означающего , то в первую очередь это не должно быть перечисление или const.

Аналогично, если набор вещей в перечислении может меняться со временем, даже если их значения остаются неизменными, перечисление, вероятно, является плохой идеей.Вы не хотите находиться в такой ситуации:

enum Banks 
{
    BankOfFoo,
    BankOfBar,
    BankOfBlah,
    BankOfABC
}

, а затем в следующей версии Bank Of Foo купил Bank of Bar, Bank of Blah прекратил свою деятельность, а Bank of ABC изменил свое название наБанк DEF и совершенно новый Bank Of XYZ были созданы.

Перечисления - это неправильный механизм для представления вещей, которые меняются со временем.Вы не должны использовать enum для этого, и вы также не должны использовать константную строку.

3 голосов
/ 13 декабря 2011
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];
1 голос
/ 13 декабря 2011

Вам лучше использовать класс для BankAccount, например:

public class BankAccount
{
    public string Name { get; set; }
    public int Number { get; set;}

    public BankAccount(string name, int number)
    {
        Name = name;
        Number = number;
    }
}

И затем удержание фактических счетов в коллекции, как список:

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;

Или создав метод, который сделает это за вас. Перечисления не способ пойти с этим; это набор констант, которые должны быть определены во время компиляции и не должны быть изменены. Даже если вам потребуется много времени, чтобы реализовать подобное изменение, оно того стоит в долгосрочной перспективе и с этого момента будет только легче.

0 голосов
/ 12 мая 2012

Я не думаю, что какой-либо из этих ответов правильно отвечает на этот вопрос. Здесь действительно нужна база данных для хранения этих данных, которая может меняться со временем . Попытка сохранить измененные данные в коде, как правило, плохая идея, поскольку для этого потребуется перекомпилировать каждый раз, когда данные изменяются.

Таблица базы данных со столбцами для AccountId , AccountName (и, возможно, других данных, которые необходимо сохранить), безусловно, является наиболее надежным решением. Если это просто быстрое и грязное приложение, ему даже не нужно быть полноценной базой данных, что-то вроде SQLite или SQL Server Express будет работать.

Затем вы можете получить доступ к этой таблице через код с помощью ADO .NET или Object-Relational-Mapper по вашему выбору.

0 голосов
/ 13 декабря 2011

Почему бы вам не использовать атрибуты?

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
}

После этого вы просто используете стандартное отражение, чтобы получить свои пользовательские атрибуты на своих полях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...