枚举枚举并强制转换为名称/值
本文关键字:枚举 转换 | 更新日期: 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值要好。
如果你担心速度,你可以使用一个简单的开关,或者一个字典来查找字符串,或者如果枚举值是连续的,只是一个简单的数组。