如何成功转换多值枚举?
How Can I Successfully Cast a Multi-Valued Enum?
问题:
我可以 return 具有 enum.ToString()
的单值 enum
的字符串表示形式。在多值 enum
的情况下(例如:使用 OR
运算符 |
表示),我在 enum.ToString()
调用中得到的只是整数值,因为 enum
无法 parse
.
Work-arounds/Hindrances:
我无法在 enum
中创建多个具有相同值的实例,例如:
public enum Languages: int
{
English = 0, // From American English
English = 1, // From UK English
Spanish = 2, // From Castillian Spanish
Spanish = 3, // From Latin American Spanish
Portuguese = 4 // From Brasilian Portuguese
Portuguese = 5, // From European Portuguese
}
因为这违反了标准,IDE 对此非常皱眉。
问题示例:
public enum Languages: int
{
English = 0 | 1, // American or UK
Spanish = 2 | 3, // Castillian or Latin American
Portuguese = 4 | 5, // Brasil or Portugal
MyMadeUpLanguage = 6,
}
int selectedLanguage = 1;
Languages result = (Languages)Enum.Parse(typeof(Languages), selectedLanguage);
string resultString = result.ToString(); // This is where '1' is returned and not English.
int nextSelectedLanguage = 6;
Languages differentResult = (Languages)Enum.Parse(typeof(Languages), nextSelectedLanguage);
string nextResultString = differentResult.ToString(); // This returns 'MyMadeUpLanguage', as we would expect.
期望(或我正在尝试做的事情):
我期望的是条件应该匹配,所以 0
或 1
将匹配 English
并且我的枚举结果将是 Languages.English
并且,因此,字符串 returned 将 English
而不是 1
。
相反,似乎 发生的是对 parse
和 enum
的调用只是 return 作为 int
而不是 Language
类型(参考上面的示例),所以 - 当然 - enum.ToString()
方法 return 是 int
。
对于多值 enum
,2
到 x <= int.MaxValue
值可能足以满足 enum
,我怎样才能调用 parse
将 enum
成功转换为预期的 enum
(这将在 enum.ToString()
方法的 return 中返回正确的字符串)?
我建议使用 Flags
属性,例如:
[Flags]
public enum Languages: int
{
None = 0, // None
English = 1 << 30, // Languages
Spanish = 1 << 29,
Portuguese = 1 << 28,
MyMadeUpLanguage = 1 << 27,
// Dialects
EnglishUS = English | 1, // From American English
EnglishGB = English | 2, // From UK English
EnglishCA = English | 3, // From Canada English
SpanishES = Spanish | 1, // From Castillian Spanish
SpanishLA = Spanish | 2, // From Latin American Spanish
PortugueseBR = Portuguese | 1, // From Brasilian Portuguese
PortuguesePT = Portuguese | 2, // From European Portuguese
MyMadeUpLanguageDialect1 = MyMadeUpLanguage | 1
}
典型比较:
Languages selectedLanguage ...
if (Languages.EnglishGB & Languages == Languages.EnglishGB) {
// From Exactly English Great Britain
...
}
if (Languages.English & Languages == Languages.English) {
// From some kind of English (Great Britain, or US dialect)
...
}
问题:
我可以 return 具有 enum.ToString()
的单值 enum
的字符串表示形式。在多值 enum
的情况下(例如:使用 OR
运算符 |
表示),我在 enum.ToString()
调用中得到的只是整数值,因为 enum
无法 parse
.
Work-arounds/Hindrances:
我无法在 enum
中创建多个具有相同值的实例,例如:
public enum Languages: int
{
English = 0, // From American English
English = 1, // From UK English
Spanish = 2, // From Castillian Spanish
Spanish = 3, // From Latin American Spanish
Portuguese = 4 // From Brasilian Portuguese
Portuguese = 5, // From European Portuguese
}
因为这违反了标准,IDE 对此非常皱眉。
问题示例:
public enum Languages: int
{
English = 0 | 1, // American or UK
Spanish = 2 | 3, // Castillian or Latin American
Portuguese = 4 | 5, // Brasil or Portugal
MyMadeUpLanguage = 6,
}
int selectedLanguage = 1;
Languages result = (Languages)Enum.Parse(typeof(Languages), selectedLanguage);
string resultString = result.ToString(); // This is where '1' is returned and not English.
int nextSelectedLanguage = 6;
Languages differentResult = (Languages)Enum.Parse(typeof(Languages), nextSelectedLanguage);
string nextResultString = differentResult.ToString(); // This returns 'MyMadeUpLanguage', as we would expect.
期望(或我正在尝试做的事情):
我期望的是条件应该匹配,所以 0
或 1
将匹配 English
并且我的枚举结果将是 Languages.English
并且,因此,字符串 returned 将 English
而不是 1
。
相反,似乎 发生的是对 parse
和 enum
的调用只是 return 作为 int
而不是 Language
类型(参考上面的示例),所以 - 当然 - enum.ToString()
方法 return 是 int
。
对于多值 enum
,2
到 x <= int.MaxValue
值可能足以满足 enum
,我怎样才能调用 parse
将 enum
成功转换为预期的 enum
(这将在 enum.ToString()
方法的 return 中返回正确的字符串)?
我建议使用 Flags
属性,例如:
[Flags]
public enum Languages: int
{
None = 0, // None
English = 1 << 30, // Languages
Spanish = 1 << 29,
Portuguese = 1 << 28,
MyMadeUpLanguage = 1 << 27,
// Dialects
EnglishUS = English | 1, // From American English
EnglishGB = English | 2, // From UK English
EnglishCA = English | 3, // From Canada English
SpanishES = Spanish | 1, // From Castillian Spanish
SpanishLA = Spanish | 2, // From Latin American Spanish
PortugueseBR = Portuguese | 1, // From Brasilian Portuguese
PortuguesePT = Portuguese | 2, // From European Portuguese
MyMadeUpLanguageDialect1 = MyMadeUpLanguage | 1
}
典型比较:
Languages selectedLanguage ...
if (Languages.EnglishGB & Languages == Languages.EnglishGB) {
// From Exactly English Great Britain
...
}
if (Languages.English & Languages == Languages.English) {
// From some kind of English (Great Britain, or US dialect)
...
}