枚举枚举并强制转换为名称/值

本文关键字:枚举 转换 | 更新日期: 2023-09-27 18:09:58

我的代码:

public enum WAVE_FORMAT : uint 
{
   WAVE_INVALIDFORMAT = 0x00000000, /* invalid format */
   WAVE_FORMAT_1M08 = 0x00000001,   /* 11.025 kHz, Mono,   8-bit  */
   WAVE_FORMAT_1S08 = 0x00000002    /* 11.025 kHz, Stereo, 8-bit  */
}
public SayIfSupported(uint myFormat):-
            foreach(uint format in Enum.GetValues(typeof(WAVE_FORMAT))){
                if ((myFormat & format) == format) {
                   Say("Supported: " + ((WAVE_FORMAT)format).ToString());
                   }
                }

这里实际的JIT代码将做什么:((WAVE_FORMAT)format).ToString() ?

当试图强制转换为适当的枚举值时,它是否应该再次枚举?

如何优雅地避免额外的枚举?

枚举枚举并强制转换为名称/值

这不是抖动造成的。这是Enum.ToString()

的代码

您可以查看ReferenceSource来发现Enum.ToString()的实现。

如果没有将[Flags]属性应用于枚举,则最终调用此代码。(你的例子中没有,但也许应该有!)

public virtual string GetEnumName(object value)
{
    if (value == null)
        throw new ArgumentNullException("value");
    if (!IsEnum)
        throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnum"), "enumType");
    Contract.EndContractBlock();
    Type valueType = value.GetType();
    if (!(valueType.IsEnum || Type.IsIntegerType(valueType)))
        throw new ArgumentException(Environment.GetResourceString("Arg_MustBeEnumBaseTypeOrEnum"), "value");
    Array values = GetEnumRawConstantValues();
    int index = BinarySearch(values, value);
    if (index >= 0)
    {
        string[] names = GetEnumNames();
        return names[index];
    }
    return null;
}

请注意它是如何进行二进制搜索并使用反射来获取enum名称的。这不是很有效,但比循环遍历所有enum值要好。

如果你担心速度,你可以使用一个简单的开关,或者一个字典来查找字符串,或者如果枚举值是连续的,只是一个简单的数组。