强制 UITypeEditor 显示枚举类型的初始值

Force UITypeEditor to display a initial value for a Enum type

我有一个 class,名称为 EnumFlagsEditor,它继承自 UITypeEditor in order to design a type editor capable to edit a Enum with FlagsAttribute, by using a custom CheckedListBox,并且还能够在同一个自定义编辑器中编辑普通枚举。

在覆盖的 UITypeEditor.GetEditStyle 方法中,我验证源 Enum 是否设置了 FlagsAttribute。如果枚举类型有这个属性 class,那么我 return UITypeEditorEditStyle.DropDown 显示我的自定义 CheckedListBox。如果没有,我 return UITypeEditorEditStyle.Modal 和 .NET Framework 使用默认编辑器编辑枚举,使用默认 ComboBox 显示和 select 枚举 values/names.

问题是,.NET framework class 库中的默认内置编辑器用于编辑普通枚举,我注意到它会搜索值为 0 的枚举名称以将其显示为默认值,如果它没有找到它,抛出一个 System.ArgumentException 并且不显示默认值。

以这个枚举为例:

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

这将在 属性 网格的编辑器中抛出一个 System.ArgumentException 并且不会显示默认值,因为 Enum 的默认 .NET Framework 编辑器期望 Enum 中的值为 0 ...

现在,使用 System.DayOfWeek 枚举来查看差异:

DayOfWeek.Sunday (0) 默认为 select,因此会抛出任何异常。

然后,在我的 EnumFlagsEditor class 中,我想阻止这种行为。我希望编辑器在 属性 网格中为我的编辑器显示一个默认值。我不关心异常,但我想显示一个特定的初始值...更准确地说,是源枚举中定义的最小值。

我该怎么做?

这不是 UITypeEditor 问题,而是 TypeConverter issue. What you can do is derive from the standard EnumConverter class,像这样:

[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:你可以避免异常捕获并进行自己的转换,但它可能比一般情况下看起来更难(取决于枚举底层类型等)。