我希望以下对 Parse 方法的调用返回枚举成员 EN_CA,但它返回的是 EN。
Enum.Parse(LanguageType, "EN_CA", true);
哪里:
enum LanguageType
{
EN = 0,
EN_CA = 0,
FR = 1
}
似乎 Parse 方法只是获取映射到传递给它的参数值的第一个成员。Parse 方法似乎在从字符串到枚举成员的转换过程中丢失了信息。更改 EN_CA 和 EN 的顺序将使上述调用返回 EN_CA,但这不会解决问题,因为在调用“EN”的方法时会导致类似的问题。
其他上下文相关信息:在我的代码中,LanguageType 枚举表示字典的索引,这些索引用于本地化语言。
有没有人知道如何将两个枚举成员映射到相同的值,同时能够从 Enum.Parse 获得适当的成员?我是否只需要实现我自己的 Enum.Parse 版本,它不会将具有相同值的成员折叠成一个?
最佳答案
一个枚举成员与其他枚举成员不同,当且仅它具有不同的值。实际上,枚举的成员被命名为常量,除了它们所持有的值外,它们之间没有真正的区别。
在您的 LanguageType
枚举中,您有两个相同值的标签,但无法区分它们。试试这个:
Console.WriteLine("{0} == {1} ? {2}",
LanguageType.EN.ToString(),
LanguageType.EN_CA.ToString(),
LanguageType.EN == LanguageType.EN_CA);
输出是:
EN == EN ? True
当您将 LanguageType.EN_CA
分配给一个变量时,会发生同样的事情,然后稍后检查该变量以查看它包含的内容。你得到的是 LanguageType.EN
。
这里的关键是成员的值在大多数情况下是最重要的,而成员的位置是冲突期间的决胜局。当两个成员具有相同的值时,首先声明的成员就是您在进行字符串转换时会看到的成员,包括在 IDE 中检查该值时。
因此实际上您有一个值 LanguageType.EN_CA
,它只是值 LanguageType.EN
的别名。
虽然我可以想到一些可爱的用途——比如解析具有相同值的多种表示形式的传入数据——但在大多数现实世界中,这确实是一件非常糟糕的事情环境,尤其是如果您希望能够进行完全对称的序列化/反序列化。
现在,关于您的本地化 Dictionary
...
在字典中多次存储同一个类对象的成本非常低,因为类对象是通过引用存储的。假设您有一个 Localization
类,以下代码在存储方面并不是特别低效:
enum LanguageType
{
EN, EN_CA, EN_US, EN_GB, EN_AU, FR
}
Dictionary<LanguageType, Localization> localizations = new Dictionary<LanguageType, Localization>();
localizations[LanguageType.EN] = new Localization("EN");
localizations[LanguageType.EN_CA] = localizations[LanguageType.EN];
localizations[LanguageType.EN_US] = localizations[LanguageType.EN];
localizations[LanguageType.EN_GB] = localizations[LanguageType.EN];
localizations[LanguageType.EN_AU] = localizations[LanguageType.EN];
即使 Localization
对象包含大量资源,上面的代码也只会创建它的一个实例。您为 LanguageType
成员获取不同的值,Dictionary
为您进行映射。
关于c# - Enum.Parse 方法返回一个不同于作为参数传递给它的枚举成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20388436/