我有这个枚举:
enum OptionalityEnum { call = 'C', put = 'P', undefined = 'N' }
有一种简单的方法可以将char转换为枚举类型吗?这有效:
char chOpt = 'C';
OptionalityEnum opt = (OptionalityEnum)chOpt; //opt = OptionalityEnum.call
但是如果我的char是枚举中不存在的值,则会产生奇怪的结果。
char chOpt = 'X';
OptionalityEnum opt = (OptionalityEnum)chOpt; //opt = 88
我知道一些Enum函数,但我找不到那个为我做这个转换的函数。
Enum.GetNames(typeof(OptionalityEnum)) = { call, na, put }
Enum.GetValues(typeof(OptionalityEnum)) = { call, na, put }
Enum.TryParse<OptionalityEnum>("C", out optionality) = false
Enum.TryParse<OptionalityEnum>("call", out optionality) = true
//... but that's not what I want.
Enum.IsDefined(typeof(OptionalityEnum), "call") = true
//... but that's not what I want.
我需要编写自己的转换器吗?像这样的东西?
private static OptionalityEnum Convert(char ch)
{
OptionalityEnum result =(OptionalityEnum)ch;
if(Enum.IsDefined(typeof(OptionalityEnum),result))
返回结果;
其他
return OptionalityEnum.undefined;
} 击>
private static bool TryConvert(char ch, out OptionalityEnum opt)
{
opt = (OptionalityEnum)ch;
return Enum.IsDefined(typeof(OptionalityEnum), opt);
}
这有效,但看起来很草率。如果这样的事情还不存在,我会感到惊讶。
编辑:我最初在我的Convert
函数中使用了一个不好的例子。我将其更改为TryConvert
函数。
答案 0 :(得分:2)
你的“马虎”解决方案似乎完全适合我。没有别的东西可以默认为“未定义”。使用条件运算符会使它更清晰:
private static OptionalityEnum Convert(char ch)
{
OptionalityEnum result = (OptionalityEnum)ch;
return Enum.IsDefined(typeof(OptionalityEnum), result)
? result : OptionalityEnum.undefined;
}
编辑:对于TryConvert
方法,我实际上确保将opt
设置为default(OptionalityEnum)
(如果它不存在)。
但不,我不相信这在框架中存在。但是,您可能希望查看我的Unconstrained Melody项目,您至少可以使用IsNamedValue
扩展方法,这样可以避免装箱。