2013-06-21 45 views
0

我有这样的枚举:如何将char转换为基于char的枚举对象?

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

有一个简单的办法把一个字符为枚举类型?这工作:

char chOpt = 'C'; 
OptionalityEnum opt = (OptionalityEnum)chOpt; //opt = OptionalityEnum.call 

但是,如果我的char是一个值不存在于枚举中,这会产生奇怪的结果。

char chOpt = 'X'; 
OptionalityEnum opt = (OptionalityEnum)chOpt; //opt = 88 

我知道一些枚举函数,但我找不到一个为我做这个转换。

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转换(char ch) { OptionalityEnum result =(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函数。

回答

2

您的“马虎”解决方案似乎完全适合我。没有别的东西会默认为“未定义”给你。使用条件运算符将使它稍微干净:

private static OptionalityEnum Convert(char ch) 
{ 
    OptionalityEnum result = (OptionalityEnum)ch; 
    return Enum.IsDefined(typeof(OptionalityEnum), result) 
     ? result : OptionalityEnum.undefined; 
} 

编辑:对于TryConvert方法,其实我确保你设置optdefault(OptionalityEnum)如果它不存在。

但不,我不相信这个框架中存在。不过,你可能想看看我的Unconstrained Melody项目,你至少可以使用IsNamedValue扩展方法,这将避免装箱。

+0

好吧,我现在看到,我使用了一个不错的例子为我的转换功能。请参阅我的TryConvert功能。它实际上更短,所以也许它不是那么糟糕。如果这样的事情已经存在,我仍然会感到惊讶。 – user2023861

+0

@ user2023861:查看我的编辑。我真的不认为有这样的事情。 –