具有多个定义的.NET枚举类型

具有多个定义的.NET枚举类型,.net,reflection,enums,.net,Reflection,Enums,想象一下这个例子: public enum eMyEnum { cValue1 = 0, cValue2 = 1, cValue2_too = 1, cValue3 = 5 } 是否有方法迭代所有值(而不是标签)?如果我尝试 var values = typeof(eMyEnum).GetEnumValues(); 我最终得到了{cValue1,cValue2,cValue2,cValue3},而我正在寻找一种方法来检索{cValue1,cValue2,cVa

想象一下这个例子:

public enum eMyEnum
{
    cValue1 = 0,
    cValue2 = 1,
    cValue2_too = 1,
    cValue3 = 5
}
是否有方法迭代所有值(而不是标签)?如果我尝试

var values = typeof(eMyEnum).GetEnumValues();
我最终得到了
{cValue1,cValue2,cValue2,cValue3}
,而我正在寻找一种方法来检索
{cValue1,cValue2,cValue3}
。注意:我故意在1和5之间留了一个间隙。

这应该可以:

var values = typeof(eMyEnum).GetEnumValues().Select(v => (int)v).Distinct();
这应该起作用:

var values = typeof(eMyEnum).GetEnumValues().Select(v => (int)v).Distinct();

如果有人感兴趣,这是VB.NET语法:

[Enum].GetValues(GetType(eMyEnum)).Cast(of eMyEnum).Distinct

所以这应该是C版本(无法测试):

Enum.GetValues(typeof(eMyEnum)).Cast().Distinct

typeof(eMyEnum).GetEnumValues().Cast().Distinct

如果有人感兴趣,这是VB.NET语法:

[Enum].GetValues(GetType(eMyEnum)).Cast(of eMyEnum).Distinct

所以这应该是C版本(无法测试):

Enum.GetValues(typeof(eMyEnum)).Cast().Distinct

typeof(eMyEnum).GetEnumValues().Cast().Distinct

林克可能会为此而采取补救措施:

IEnumerable<eMyEnum> values = typeof(eMyEnum).GetEnumValues()
                               .Cast<int>().Distinct().Cast<eMyEnum>();
IEnumerable values=typeof(eMyEnum).GetEnumValues()
.Cast().Distinct().Cast();

请注意,我认为这只会得到cValue2,而不会得到cValue2。

Linq可能会为此提供帮助:

IEnumerable<eMyEnum> values = typeof(eMyEnum).GetEnumValues()
                               .Cast<int>().Distinct().Cast<eMyEnum>();
IEnumerable values=typeof(eMyEnum).GetEnumValues()
.Cast().Distinct().Cast();

请注意,我认为这只会得到cValue2,而不会得到cValue2\u。

cValue2和cValue2\u应该是一样的吗?如果是这样的话,那么您(ab)正在使用枚举来实现它们不是为之设计的。您的问题可能与从int到引擎盖下的枚举(这是完全有效的)的某些强制转换有关。@JohnL:from msdn:“您可以为枚举类型的枚举器列表中的元素分配任何值”(cfr。)对,但这样您就可以在int之间来回强制转换它们,并使这些值具有意义。我在那篇文章中没有看到任何东西表明拥有重复的值是有意义的——你为什么需要这个,只是出于兴趣?@JohnL:code兼容性:
enum{a=1,b,c}
变成了
enum{a=1,a=1,b=2,b=2,c=2,c=2}
。所有现有的代码仍然是构建的。cValue2和cValue2_也应该是相同的吗?如果是这样的话,那么您(ab)正在使用枚举来实现它们不是为之设计的。您的问题可能与从int到引擎盖下的枚举(这是完全有效的)的某些强制转换有关。@JohnL:from msdn:“您可以为枚举类型的枚举器列表中的元素分配任何值”(cfr。)对,但这样您就可以在int之间来回强制转换它们,并使这些值具有意义。我在那篇文章中没有看到任何东西表明拥有重复的值是有意义的——你为什么需要这个,只是出于兴趣?@JohnL:code兼容性:
enum{a=1,b,c}
变成了
enum{a=1,a=1,b=2,b=2,c=2,c=2}
。所有现有的代码仍在生成中。在发布我的回复后,我注意到了你的回复,哇,我花了12分钟来确保我的表达做了正确的事情!在发布我的回复后,我注意到了你的回复,哇,我花了12分钟来确保我的表情是正确的!