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

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

Enum.GetValues(typeof(TipoControlador))

Теперь я бы хотел их локализовать так: Локализация атрибутов описаний перечислений

Как я могу их объединить? Моей первой мыслью было переопределить метод ToString методом расширения, но это невозможно = (

Ответы [ 3 ]

1 голос
/ 21 ноября 2011

У вас есть 2 проблемы: во-первых, как локализовать перечисления, которые решаются с помощью Локализация атрибутов описаний перечислений .

Во-вторых, как отобразить локализованное имя при использовании перечислениязначение.Эту проблему можно решить, создав простой объект-оболочку, например:

public sealed class NamedItem
{
    private readonly string name;
    private readonly object value;

    public NamedItem (string name, object value)
    {
        this.name = name;
        this.value = value;
    }

    public string Name { get { return name; } }
    public object Value { get { return value; } }

    public override string ToString ()
    {
        return name;
    }
}

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

Когда у вас есть этот класс, вы можете установить раскрывающиеся списки DisplayMember на Name и ValueMember на Value.Это будет означать, что dropdown.SelectedValue все равно вернет ваше перечисление.

1 голос
/ 21 ноября 2011

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

public static class LocalizedEnumExtensions
{
    private static ResourceManager _resources = new ResourceManager("MyClass.myResources",
        System.Reflection.Assembly.GetExecutingAssembly());

    public static IEnumerable<string> GetLocalizedNames(this IEnumerable enumValues)
    {
        foreach(var e in enumValues)
        {
            string localizedDescription = _resources.GetString(String.Format("{0}.{1}", e.GetType(), e));
            if(String.IsNullOrEmpty(localizedDescription))
            {
                yield return e.ToString();
            }
            else
            {
                yield return localizedDescription;
            }
        }
    }
}

Вы можете использовать его следующим образом:

Enum.GetValues(typeof(TipoControlador)).GetLocalizedNames();

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

if(!e.GetType().IsEnum) throw new InvalidOperationException(String.Format("{0} is not a valid Enum!", e.GetType()));
0 голосов
/ 10 апреля 2013

Я знаю, что этот вопрос старый, но это может помочь некоторым людям. Вы можете просто обработать событие Format элемента управления ComboBox (http://msdn.microsoft.com/en-us/library/system.windows.forms.listcontrol.format.aspx),) и добавить в него свою текстовую логику.

    private void ComboBoxFormat(object sender, ListControlConvertEventArgs e)
    {
        e.Value = GetDescription(e.Value);
    }

    public static string GetDescription(object item)
    {
        string desc = null;

        Type type = item.GetType();
        MemberInfo[] memInfo = type.GetMember(item.ToString());
        if (memInfo != null && memInfo.Length > 0)
        {
            object[] attrs = memInfo[0].GetCustomAttributes(typeof(DescriptionAttribute), false);
            if (attrs != null && attrs.Length > 0)
            {
                desc = (attrs[0] as DescriptionAttribute).Description;
            }
        }

        if (desc == null) // Description not found
        {
            desc = item.ToString();
        }

        return desc;
    }

При этом элемент управления ComboBox по-прежнему содержит значения перечисления, а не строки.

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