将组合框 SelectedValue 转换为枚举类型 - WinForm

Cast combobox SelectedValue to Enum type - WinForm

嘿,伙计,我想将组合框 SelectedValue 转换为枚举类型,但选定的值项是一个列表,如 {Title, Value}; Title 是“枚举项的描述属性” 并且 Value 是“枚举项".

var EnumItems = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(item =>
                   new
                   {
                       Text = item.GetEnumName(),
                       Value = item
                   }).ToList();
            MyCombo.DataSource = EnumItems;
            MyCombo.DisplayMember = "Text";
            MyCombo.ValueMember = "Value";

GetEnumName() 方法:

public static string GetEnumName(this System.Enum myEnum)
        {
            var enumDisplayName = myEnum.GetType().GetMember(myEnum.ToString()).FirstOrDefault();
            if (enumDisplayName != null)
            {
                //return enumDisplayName.GetCustomAttribute<DescriptionAttribute>()?.Get();
                return string.Format("{0}", (Attribute.GetCustomAttribute(myEnum.GetType().GetField(myEnum.ToString()), typeof(DescriptionAttribute)) as DescriptionAttribute).Description, false);
            }

            return "";
        }

我试试这样投:

var getEnum = (MyEnum)Enum.Parse(typeof(MyEnum), MyCombo.SelectedValue.ToString());

但是这样 return:

System.ArgumentException: 'Requested value '{ Text = enumDescriptionText, Value = enumValue }' was not found.'

你有解决这个问题的方法吗?

设置数据源时,您创建了具有 TextValue 属性的 匿名类型 'a

comboBox1.DataSource = Enum.GetValues(typeof(MyEnum)).Cast<MyEnum>().Select(item => new
{
    Text = item.GetEnumDescription(),
    Value = item
}).ToList();

所以结果是 List<'a>

当您尝试检索 ComboBox value/item 中选择的项目时,它也会是 匿名类型 'a 的项目,因此您可以'将其显式转换为 MyEnum

解决方案可能正在使用dynamics,它也可以是您的匿名类型并且在运行时有TextValue 属性:

private void OnComboBoxSelectedValueChanged(object sender, EventArgs e)
{
    dynamic selectedItem = comboBox1.SelectedItem;

    if (selectedItem != null)
    {
        MyEnum enumItem = (MyEnum)selectedItem.Value;
        string itemDescription = selectedItem.Text;

        _ = MessageBox.Show(string.Format("Enum item: {0}\nItem description: {1}", enumItem, itemDescription));
    }
}

我有这个结果:

我的枚举看起来像:

enum MyEnum
{
    [Description("My 1st item")]
    MyItem1,
    [Description("My 2nd item")]
    MyItem2,
    [Description("My 3rd item")]
    MyItem3
}

我的 .GetEnumDescription() 被重写为你的 .GetEnumName() 三元样式:

public static class EnumExtensions
{
    public static string GetEnumDescription(this Enum enumValue) =>
        enumValue.GetType().GetMember(nameof(enumValue)).FirstOrDefault() is MemberInfo
        ? $"{(Attribute.GetCustomAttribute(enumValue.GetType().GetField(nameof(enumValue)), typeof(DescriptionAttribute)) as DescriptionAttribute)?.Description}"
        : string.Empty;
}