将组合框 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.'
你有解决这个问题的方法吗?
设置数据源时,您创建了具有 Text
和 Value
属性的 匿名类型 '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
。
解决方案可能正在使用dynamic
s,它也可以是您的匿名类型并且在运行时有Text
和Value
属性:
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;
}
嘿,伙计,我想将组合框 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.'
你有解决这个问题的方法吗?
设置数据源时,您创建了具有 Text
和 Value
属性的 匿名类型 '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
。
解决方案可能正在使用dynamic
s,它也可以是您的匿名类型并且在运行时有Text
和Value
属性:
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;
}