其中Lambda中的条件有两个值


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));

上面的行在开发环境和登台环境中产生不同的结果。

在开发阶段,它返回两个值,但在阶段,有时它只返回一个值(value1value2),有时两个值都返回。

请帮我找出这里的问题。

可能是因为文档中的这句话:

你的代码不能依赖于字段返回的顺序,因为这个顺序是变化的。

你跳过了你迭代的第一个项目(你的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++)

相关内容

  • 没有找到相关文章

最新更新