6

给定这样的枚举:

public enum City {
    London    = 1,
    Liverpool  = 20,
    Leeds       = 25
}

public enum House {
    OneFloor    = 1,
    TwoFloors = 2
}

我正在使用以下代码给我一个 IEnumerable:

City[] values = (City[])Enum.GetValues(typeof(City)); 
var valuesWithNames = from value in values                       
   select new { value = (int)value, name = value.ToString() }; 

代码工作得很好,但是我必须为很多枚举这样做。有没有办法我可以创建一个通用的方式来做到这一点?

4

3 回答 3

3

使用 Jon Skeet无拘无束的旋律

using UnconstrainedMelody;

您可以将枚举值放入 a 中Dictionary<int, string>,然后对其进行枚举:

var valuesAsDictionary = Enums.GetValues<City>()
                              .ToDictionary(key => (int)key, value => value.ToString());

但你可能甚至不需要这样做。为什么不直接枚举值:

foreach (var value in Enums.GetValues<City>())
{
    Console.WriteLine("{0}: {1}", (int)value, value);
}
于 2012-09-16T15:25:17.323 回答
2

此功能可能会帮助您:

public static IEnumerable<KeyValuePair<int, string>> GetValues<T>() where T : struct
{
        var t = typeof(T);
        if(!t.IsEnum)
            throw new ArgumentException("Not an enum type");

        return Enum.GetValues(t).Cast<T>().Select (x => 
               new KeyValuePair<int, string>(
                   (int)Enum.ToObject(t, x), 
                    x.ToString()));
}

用法:

var values = GetValues<City>();
于 2012-09-16T15:21:56.950 回答
1

为什么不:

    IEnumerable<object> GetValues<T>()
    {
        return Enum.GetValues(typeof (T))
                   .Cast<T>()
                   .Select(value => new {     
                                             value = Convert.ToInt32(value),
                                             name = value.ToString()
                                         });

    }

所以你可以使用:

var result = GetValues<City>();

如果你想让约束泛型Tenum,因为enum 不能直接用作泛型约束,但是enum继承自 interface IConvertible,相信这种方式是可以的:

IEnumerable<object> GetValues<T>() where T: struct, IConvertible
{}

替换IEnumerable<object>Dictionary

Dictionary<int, string> GetValues<T>() where T :  struct, IConvertible
{
    return Enum.GetValues(typeof (T)).Cast<T>()
               .ToDictionary(value => Convert.ToInt32(value),
                             value => value.ToString());
}

编辑:正如 Magnus 的评论,如果您需要确保项目的顺序,Dictionary 不是选项。定义自己的强类型会更好。

于 2012-09-16T15:10:22.123 回答