Lambda中的条件有两个值

时间:2014-05-05 11:51:03

标签: c# .net reflection

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),有时两者都返回。

请帮我解决这个问题。

2 个答案:

答案 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++)