public enum Values
{
[Description("All Fabs")]
value1 = 0,
[Description("Fab 1")]
value2 = 1,
[Description("Fab 2")]
value3 = 2,
[Description("Fab 3")]
value4 = 3,
[Description("Fab 4")]
value5 = 4,
[Description("Fab 5")]
value6 = 5
}
public static Dictionary<int, string> ConvertEnumToDictionary<T>()
{
var type = typeof(T);
if(!type.IsEnum)
{
throw new InvalidOperationException();
}
Dictionary<int, string> result = new Dictionary<int, string>();
bool header = true;
foreach(var field in type.GetFields())
{
if(header)
{
header = false;
continue;
}
var attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
if(attribute != null)
{
result.Add((int)field.GetValue(null), attribute.Description);
}
}
return result;
}
Displays.ConvertEnumToDictionary<Values>().Where(i => (i.Key == value2 || i.Key == value1));
上述行在开发环境和暂存环境中产生差异结果。
在开发中,它会返回两个值,但在暂存时,有时它只返回一个值(value1
或value2
),有时两者都返回。
请帮我解决这个问题。
答案 0 :(得分:3)
可能是因为documentation中的这句话:
您的代码不得依赖于返回字段的顺序,因为该顺序会有所不同。
您正在跳过您迭代的第一个项目(您的header
变量)。只有当字段每次都以相同的顺序返回时,这才有效。
尝试删除跳过“标题”的代码,然后将字段值转换为变量并检查是否value.Equals(default(T))
。这将跳过枚举值,其中0为后备整数值。
答案 1 :(得分:0)
它可以链接到&#34;标题&#34;迭代原始字段时的一部分。更喜欢这种方式迭代枚举值:
FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Static)
然后你可以从offset-0开始:
for (int i = 0; i < fields.Length; i++)