Связывание строк с перечислениями в C # - PullRequest
1 голос
/ 10 августа 2009

Я работаю в окне C # ... vs05 ...... Я хочу поставить пробел в строке enum .... Я делаю это ниже кода, есть это ..... Моя проблема после выбора значения из Комбо, как я могу получить номер индекса этого значения ..... и если я перешел в режим редактирования, то мне нужно показать значение, которое уже выбрано пользователем ..... как получить перечисление выбранного значения на основе порядковый номер

public enum States
{
  California,
  [Description("New Mexico")]
  NewMexico,
  [Description("New York")]
  NewYork,
  [Description("South Carolina")]
  SouthCarolina,
  Tennessee,
  Washington
}

public static string GetEnumDescription(Enum value)
{
   FieldInfo fi = value.GetType().GetField(value.ToString());

   DescriptionAttribute[] attributes =
                    (DescriptionAttribute[])fi.GetCustomAttributes(
                     typeof(DescriptionAttribute), false);

   if (attributes != null && attributes.Length > 0)
      return attributes[0].Description;
   else
      return value.ToString();
}

public static IEnumerable<T> EnumToList<T>()
{
    Type enumType = typeof(T);

    // Can't use generic type constraints on value types,
    // so have to do check like this
    if (enumType.BaseType != typeof(Enum))
       throw new ArgumentException("T must be of type System.Enum");

    Array enumValArray = Enum.GetValues(enumType);
    List<T> enumValList = new List<T>(enumValArray.Length);

    foreach (int val in enumValArray)
    {
       enumValList.Add((T)Enum.Parse(enumType, val.ToString()));
    }

    return enumValList;
 }

 private void Form1_Load(object sender, EventArgs e)
 {
    //cboSurveyRemarksType = new ComboBox();
    cboSurveyRemarksType.Items.Clear();
    foreach (States state in EnumToList<States>())
    {
       cboSurveyRemarksType.Items.Add(GetEnumDescription(state));
    }
 }

Ответы [ 3 ]

2 голосов
/ 10 августа 2009
  1. Вы можете перебрать доступные перечисления (Enum.GetValues(enumType)) и посмотреть, какое из них имеет выбранное описание (не лучшая производительность, но, вероятно, это не имеет значения для комбинированных списков).
  2. Вы можете создать свой собственный атрибут, и индекс там тоже есть (некрасиво с точки зрения практики кодирования)
  3. Если вы хотите повысить производительность для опции # 1, вы можете предварительно кэшировать объект Dictionary<String, Integer> с описаниями каждого перечисления и использовать его вместо этого.
1 голос
/ 10 августа 2009

Итак, у вас есть целое число, и вы хотите преобразовать его обратно в тип enum? Просто брось это. Пока вы явно не указали никаких значений в объявлении enum, и пока получаемый вами «индекс» основан на 0, вы должны быть в состоянии сделать:

States state = (States) stateIndex;

(Обратите внимание, что в соответствии с обычными соглашениями об именах .NET это следует называть State, кстати - множественные числа обычно резервируются для флагов.)

Этот ответ основан на тексте вашего вопроса, а не на вашем коде - я не вижу в вашем коде ничего, что действительно относится к индексу.

0 голосов
/ 10 августа 2009

Simple. Вы можете привести выбранный индекс (который является целым числом) к перечислению States. Я написал простой метод тестирования, который демонстрирует несколько примеров использования enum, которые должны помочь прояснить концепцию:

private static void TestMethod()
    {
        foreach (States state in EnumToList<States>())
        {
            Console.Write(GetEnumDescription(state) + "\t");
            Int32 index = ((Int32)state);
            Console.Write(index.ToString() + "\t");
            States tempState = (States)index;
            Console.WriteLine(tempState.ToString());

        }
        Console.ReadLine();
    }

Если вы не понимаете, с удовольствием уточню.

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