2012-06-21 2 views
2

У меня есть это перечисление:Включить перечисление в список пользовательских объектов?

public enum Translation  
{ 
    English=1, 
    Russian, 
    French, 
    German 
} 

У меня есть пользовательский объект

public class MyKeyValuePair 
{ 
    string code {set;get;} 
    string text {set;get;} 

} 

Я хочу, чтобы все мои члены перечисления в список MyKeyValuePair. Как я могу это сделать?

ответ

4

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

// Type and property names changed for sanity 
var pairs = Enum.GetValues(typeof(Translation)) 
       .Cast<Translation>() 
       .Select(t => new KeyValuePair { 
          Code = ((int) t).ToString(), 
          Text = t.ToString() 
         }); 

Обратите внимание, что используя имена значений перечисления в их текстовое представление очень ограничен - может только использовать действительные идентификаторы C#. Вы также можете найти его полезным в долгосрочной перспективе использовать атрибут для описания текста, по крайней мере, в качестве замены:

public enum Translation { 
    ... 
    [Description("Traditional Chinese")] 
    TraditionalChinese 
} 

Атрибуты также позволяют добавлять другие данные - например, если вы не хотите чтобы просто быть целочисленным представлением, вы можете поместить это в перечисление. Вам нужно будет получить атрибуты с отражением. У меня есть поддержка DescriptionAttribute в пределах Unconstrained Melody, которая упрощает различные задачи перечисления, но для других атрибутов потребуется немного больше работы.

Опять же, еще один вариант - просто построить словарь или набор непосредственно в коде с использованием инициализатора коллекции. Честно говоря, недостаточно ясно, что вы после. Надеюсь, что некоторые из них помогут.

+0

Это атрибут встроенной вещи C#? o.O – Alxandr

+0

@Alxandr: 'DescriptionAttribute' не встроен в язык, нет. Это обычный атрибут. (Атрибуты сами * * встроены в язык, хотя.) –

+0

Да, я знаю это (я пишу много C# и сам делал аммутацию атрибутов), но то, о чем я подумал, было больше похоже; будет ли 'DisplayAttribute' изменять' ToString' перечисления? Причина, по которой мне когда-то приходилось делать что-то подобное, и то, что я сделал, это сделать свой собственный атрибут и использовать метод 'ToString' xD – Alxandr

0

Простой; создайте статический метод, примерно так:

public static mykeyvaluePair Translate(Translation translation) { 
    switch(translation) { 
     case Translation.English: 
      return new mykeyvaluePair { code = "en", text = "English" }; 
     case Translation.Russian: 
      return new mykeyvaluePair { code = "ru", text = "Russian" }; 
     default: 
      return null; 
    } 
} 
Смежные вопросы