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

时间:2015-08-26 12:29:26

标签: c#

我的代码:

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()

当尝试转换为适当的枚举值时,它是否会再次枚举?

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

1 个答案:

答案 0 :(得分:1)

这不是JITTer。这是Enum.ToString()

的代码

您可以查看ReferenceSource以发现the implementation of 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;
}

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

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