我正在使用静态方法
Enum.GetValues(typeof(SomeEnum));
Run Code Online (Sandbox Code Playgroud)
当您需要做的只是枚举值时,此方法很有效,但由于某种原因,它返回一个非常简单的Array类形式. 我试图找到一种简单的方法将其返回值转换为更"正常"的集合类,如常规数组或List <>.
到目前为止,如果我想这样做,我必须枚举Enum.GetValues(typeof(SomeEnum))的输出; 并将它们逐个添加到List <>.
任何想法如何更干净地做到这一点?
回答:
关键是要投出返回结果 -
SomeEnum[] enums = (SomeEnum[]) Enum.GetValues(typeof(SomeEnum));
Run Code Online (Sandbox Code Playgroud)
如果你需要一个List,那么jus将它包装在括号中并ToList,如下所示:
List<SomeEnum> list = ((SomeEnum[]) Enum.GetValues(typeof(SomeEnum))).ToList();
Run Code Online (Sandbox Code Playgroud)
如果您使用的是.NET 3.5,则还可以使用Cast<T>和ToList扩展方法.
IEnumerable<SomeEnum> enums = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>();
Run Code Online (Sandbox Code Playgroud)
如果您愿意,也可以获得一个列表
List<SomeEnum> list = Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().ToList();
Run Code Online (Sandbox Code Playgroud)
受到 Jon Skeet不受约束的旋律的启发,我想出了我更喜欢的版本:
public static class Enum<T>
where T: struct
{
static Enum()
{
Trace.Assert(typeof(T).IsEnum);
Values = Array.AsReadOnly((T[])Enum.GetValues(typeof(T)));
}
public static readonly ReadOnlyCollection<T> Values;
}
Run Code Online (Sandbox Code Playgroud)
和用法:
var values = Enum<BindingFlags>.Values;
Run Code Online (Sandbox Code Playgroud)
好消息是这个版本在多次调用时运行速度更快,因为它不会每次都创建新数组。
我发现在这里你可以这样做:
SomeEnum[] enums = (SomeEnum[]) Enum.GetValues(typeof(SomeEnum));
Run Code Online (Sandbox Code Playgroud)
如果您需要一个列表,只需在末尾使用 .ToList() ,如下所示:
List<SomeEnum> list = ((SomeEnum[]) Enum.GetValues(typeof(SomeEnum))).ToList();
Run Code Online (Sandbox Code Playgroud)
或者如果你更喜欢这个:
List<SomeEnum> list2 = new List<SomeEnum>((SomeEnum[]) Enum.GetValues(typeof(SomeEnum)));
Run Code Online (Sandbox Code Playgroud)