Как создать перечисление из строкового представления? C # - PullRequest
0 голосов
/ 15 июля 2009

я пытаюсь передать обратно из пользовательского элемента управления список строк, которые являются частью перечисления, например:

<bni:products id="bnProducts" runat="server" ProductsList="First, Second, Third"  />

и в коде сделайте что-то вроде этого:

public enum MS 
    {
        First = 1,
        Second,
        Third
    };
    private MS[] _ProductList;
    public MS[] ProductsList
    {
        get
        {
            return _ProductList;
        }
        set
        {
            _ProductList = how_to_turn_string_to_enum_list;
        }
    }

Моя проблема в том, что я не знаю, как превратить эту строку в список enum, так что должно быть "how_to_turn_string_to_enum_list"? или вы знаете, как лучше использовать перечисления в пользовательских элементах управления? Я действительно хочу быть в состоянии передать список, который аккуратный

Ответы [ 5 ]

6 голосов
/ 15 июля 2009

Это решение short , но оно не охватывает некоторые очень важные вещи, такие как локализация и неправильные входные данные.

private static MS[] ConvertStringToEnumArray(string text)
{
    string[] values = text.Split(new char[] { ' ', ',' }, StringSplitOptions.RemoveEmptyEntries);
    return Array.ConvertAll(values, value => (MS)Enum.Parse(typeof(MS), value));
}
4 голосов
/ 15 июля 2009

Вам нужно взглянуть на метод System.Enum.Parse .

3 голосов
/ 15 июля 2009

Enum.Parse - это канонический способ разбора строки для получения перечисления:

MS ms = (MS) Enum.Parse(typeof(MS), "First");

но вам нужно разбить строку самостоятельно.

Однако ваше свойство в настоящее время имеет тип MS[] - переменная value в установщике не будет строкой. Я подозреваю, что вам нужно сделать ваше свойство строкой и проанализировать его там, сохранив результаты в MS[]. Например:

private MS[] products;

public string ProductsList
{
    get
    {
        return string.Join(", ", Array.ConvertAll(products, x => x.ToString()));
    }
    set
    {
        string[] names = value.Split(',');
        products = names.Select(name => (MS) Enum.Parse(typeof(MS), name.Trim()))
                        .ToArray();
    }
}

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

2 голосов
/ 15 июля 2009
string[] stringValues = inputValue.Split(',');

_ProductList = new MS[stringValues.Length];

for (int i=0;i< stringValues.Length;i++)
  _ProductList[i] = (MS) Enum.Parse(typeof(MS), stringValues[i].Trim());

(обновил мой код, потому что я неправильно прочитал ваш код)

0 голосов
/ 15 июля 2009

Пометьте свое перечисление атрибутом [Flags] и объедините флаги вместо массива значений перечисления.

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