0

我有这个枚举:

enum OptionalityEnum { call = 'C', put = 'P', undefined = 'N' }

有没有一种简单的方法可以将 char 转换为 enum 类型?这有效:

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.

我需要编写自己的转换器吗?像这样的东西?

私有静态 OptionalityEnum Convert(char ch) { OptionalityEnum 结果 = (OptionalityEnum)ch; if (Enum.IsDefined(typeof(OptionalityEnum), result)) 返回结果;否则返回 OptionalityEnum.undefined; }

private static bool TryConvert(char ch, out OptionalityEnum opt)
{
    opt = (OptionalityEnum)ch;
    return Enum.IsDefined(typeof(OptionalityEnum), opt);
}

这可行,但似乎草率。如果这样的东西尚不存在,我会感到惊讶。

编辑:我最初为我的Convert功能使用了一个不好的例子。我把它改成了TryConvert函数。

4

1 回答 1

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

于 2013-06-21T15:29:16.477 回答