Как определить перечисление со строковым значением? - PullRequest
76 голосов
/ 21 декабря 2011

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

Проблема в том, как определить enum с помощью строкового представления, например:

public enum SeparatorChars{Comma = ",", Tab = "\t", Space = " "}

Ответы [ 14 ]

2 голосов
/ 10 августа 2012

Хотя на самом деле невозможно использовать char или string в качестве основы для перечисления, я думаю, это не то, что вам действительно нравится делать.

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

Сначала мы должны связать некоторую строку со значением перечисления.Это можно сделать с помощью DescriptionAttribute, как описано здесь или здесь .

Теперь вам нужно создать список значений перечисления и соответствующие описания.Это можно сделать с помощью следующего метода:

/// <summary>
/// Creates an List with all keys and values of a given Enum class
/// </summary>
/// <typeparam name="T">Must be derived from class Enum!</typeparam>
/// <returns>A list of KeyValuePair&lt;Enum, string&gt; with all available
/// names and values of the given Enum.</returns>
public static IList<KeyValuePair<T, string>> ToList<T>() where T : struct
{
    var type = typeof(T);

    if (!type.IsEnum)
    {
        throw new ArgumentException("T must be an enum");
    }

    return (IList<KeyValuePair<T, string>>)
            Enum.GetValues(type)
                .OfType<T>()
                .Select(e =>
                {
                    var asEnum = (Enum)Convert.ChangeType(e, typeof(Enum));
                    return new KeyValuePair<T, string>(e, asEnum.Description());
                })
                .ToArray();
}

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

var comboBox = new ComboBox();
comboBox.ValueMember = "Key"
comboBox.DisplayMember = "Value";
comboBox.DataSource = EnumUtilities.ToList<Separator>();

comboBox.SelectedIndexChanged += (sender, e) =>
{
    var selectedEnum = (Separator)comboBox.SelectedValue;
    MessageBox.Show(selectedEnum.ToString());
}

Пользователь видит все строковые представления перечисления, и в вашем коде вы получите желаемое значение перечисления.

2 голосов
/ 21 декабря 2011

Ну, сначала вы пытаетесь назначить строки, а не символы, даже если они всего один символ. используйте «,» вместо «,». Далее, перечисления принимают только целочисленные типы без char, вы можете использовать значение Юникода, но я настоятельно советую вам не делать этого. Если вы уверены, что эти значения остаются неизменными в разных культурах и языках, я бы использовал статический класс с константными строками.

0 голосов
/ 21 апреля 2016

Мы не можем определить перечисление как строковый тип. Разрешенными типами для перечисления являются byte, sbyte, short, ushort, int, uint, long или ulong.

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

@ narendras1414

0 голосов
/ 28 февраля 2016

Класс перечисления

 public sealed class GenericDateTimeFormatType
    {

        public static readonly GenericDateTimeFormatType Format1 = new GenericDateTimeFormatType("dd-MM-YYYY");
        public static readonly GenericDateTimeFormatType Format2 = new GenericDateTimeFormatType("dd-MMM-YYYY");

        private GenericDateTimeFormatType(string Format)
        {
            _Value = Format;
        }

        public string _Value { get; private set; }
    }

Потребление перечисления

public static void Main()
{
       Country A = new Country();

       A.DefaultDateFormat = GenericDateTimeFormatType.Format1;

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