如何将char转换为基于char的Enum对象?

时间:2013-06-21 15:24:20

标签: c# enums

我有这个枚举:

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函数。

1 个答案:

答案 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扩展方法,这样可以避免装箱。