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
),有时两个值都返回。
请帮我找出这里的问题。
可能是因为文档中的这句话:
你的代码不能依赖于字段返回的顺序,因为这个顺序是变化的。
你跳过了你迭代的第一个项目(你的header
变量)。只有当字段每次都以相同的顺序返回时才有效。
尝试删除跳过"header"的代码,而不是将字段值转换为变量并检查value.Equals(default(T))
。这将跳过以0作为支持整数值的enum值。
在迭代原始字段时可能会链接到"header"部分。首选这种方式来迭代枚举值:
FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Static)
可以从offset-0:
开始for (int i = 0; i < fields.Length; i++)