Заставить UITypeEditor отображать начальное значение для типа Enum - PullRequest
0 голосов
/ 01 июня 2019

У меня есть класс с именем EnumFlagsEditor, который наследуется от UITypeEditor для разработки редактора типов, способного редактировать Enum с FlagsAttribute , используя пользовательский CheckedListBox , а также возможность редактировать обычный Enum в том же пользовательском редакторе.

В переопределенном методе UITypeEditor.GetEditStyle я проверяю, имеет ли исходный Enum набор FlagsAttribute.Если тип Enum имеет этот класс атрибутов, тогда я возвращаю UITypeEditorEditStyle.DropDown, чтобы отобразить мой пользовательский CheckedListBox.Если его нет, я возвращаю UITypeEditorEditStyle.Modal, а .NET Framework делает все остальное, используя редактор по умолчанию для редактирования Enums, используя значение по умолчанию ComboBox для отображения и выбора значений / имен Enum.

Проблема в том, чтовстроенный редактор по умолчанию в библиотеке классов .NET Framework для редактирования обычного Enum, я заметил, что он ищет имя Enum со значением 0, чтобы отобразить его как значение по умолчанию, и, если он не находит его, выдает System.ArgumentException ине отображает значение по умолчанию.

Взять в качестве примера этот Enum:

public enum TestEnum {
    a = 1,
    b = 2,
    c = 4
}

. В редакторе сетки свойств будет выброшено System.ArgumentException, и значение по умолчанию не будет отображаться, так как редактор .NET Framework по умолчанию дляa Enum ожидает значение 0 внутри Enum ...

enter image description here

Теперь, используя Enum System.DayOfWeek , чтобы увидетьразница:

enter image description here

DayOfWeek.Sunday (0) выбрана по умолчанию, поэтому выбрасывается любое исключение.

Затем в моемEnumFlagsEditor класс Я хотел бы предотвратить такое поведение.Я хочу, чтобы редактор показывал значение по умолчанию в сетке свойств моего редактора.Меня не волнует исключение, но я хотел бы отобразить определенное, начальное значение ..., а точнее, наименьшее определенное значение в исходном Enum.

Как я могу это сделать ?.

1 Ответ

1 голос
/ 01 июня 2019

Это не проблема UITypeEditor, а проблема TypeConverter .То, что вы можете сделать, это извлечь из стандартного класса EnumConverter , например:

[TypeConverter(typeof(MyEnumConverter))]
public enum TestEnum
{
    a = 1,
    b = 2,
    c = 4
}

public class MyEnumConverter : EnumConverter
{
    public MyEnumConverter(Type type)
        : base(type)
    {
    }

    public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
    {
        try
        {
            return base.ConvertTo(context, culture, value, destinationType);
        }
        catch
        {
            if (destinationType == typeof(string))
            {
                // or whatever you see fit
                return "a";
            }
            throw;
        }
    }
}

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

...