我有一个组合框,我在其中显示一些条目,如:
Equals
Not Equals
Less Than
Greater Than
Run Code Online (Sandbox Code Playgroud)
请注意,这些字符串包含空格.我有一个定义的枚举,它匹配这些条目,如:
enum Operation{Equals, Not_Equals, Less_Than, Greater_Than};
Run Code Online (Sandbox Code Playgroud)
由于不允许空间,我使用了_字符.
现在,有没有办法将给定的字符串自动转换为枚举元素而无需在C#中编写循环或一组if条件?
Meh*_*ari 78
我建议构建一个Dictionary<string, Operation>将友好名称映射到枚举常量并在元素本身中使用常规命名约定.
enum Operation{ Equals, NotEquals, LessThan, GreaterThan };
var dict = new Dictionary<string, Operation> {
{ "Equals", Operation.Equals },
{ "Not Equals", Operation.NotEquals },
{ "Less Than", Operation.LessThan },
{ "Greater Than", Operation.GreaterThan }
};
var op = dict[str];
Run Code Online (Sandbox Code Playgroud)
或者,如果你想坚持你当前的方法,你可以做(我建议不要这样做):
var op = (Operation)Enum.Parse(typeof(Operation), str.Replace(' ', '_'));
Run Code Online (Sandbox Code Playgroud)
Ric*_*lay 20
使用字典创建专用映射器(根据Mehrdad的答案)或实现TypeConverter.
您的自定义TypeConverter可以替换" " -> "_"(反之亦然),也可以反映枚举并使用属性来确定项目的显示文本.
enum Operation
{
[DisplayName("Equals")]
Equals,
[DisplayName("Not Equals")]
Not_Equals,
[DisplayName("Less Than")]
Less_Than,
[DisplayName("Greater Than")]
Greater_Than
};
public class OperationTypeConverter : TypeConverter
{
private static Dictionary<string, Operation> operationMap;
static OperationTypeConverter()
{
BindingFlags bindingFlags = BindingFlags.Static | BindingFlags.GetField
| BindingFlags.Public;
operationMap = enumType.GetFields(bindingFlags).ToDictionary(
c => GetDisplayName(c)
);
}
private static string GetDisplayName(FieldInfo field, Type enumType)
{
DisplayNameAttribute attr = (DisplayNameAttribute)Attribute.GetCustomAttribute(typeof(DisplayNameAttribute));
return (attr != null) ? attr.DisplayName : field.Name;
}
public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
{
string stringValue = value as string;
if (stringValue != null)
{
Operation operation;
if (operationMap.TryGetValue(stringValue, out operation))
{
return operation;
}
else
{
throw new ArgumentException("Cannot convert '" + stringValue + "' to Operation");
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
可以通过以下几种方式改进此实施:
Ada*_*Dev 20
Operation enumVal = (Operation)Enum.Parse(typeof(Operation), "Equals")
Run Code Online (Sandbox Code Playgroud)
对于"Not Equals",您需要在上面的语句中用下划线替换空格
编辑:以下版本在尝试解析之前用下划线替换空格:
string someInputText;
var operation = (Operation)Enum.Parse(typeof(Operation), someInputText.Replace(" ", "_"));
Run Code Online (Sandbox Code Playgroud)
Sam*_*ijo 10
您可以使用Parse方法:
Operarion operation = (Operation)Enum.Parse(typeof(Operation), "Not_Equals");
Run Code Online (Sandbox Code Playgroud)
这里有一些例子