我有一些枚举,需要将它们作为 List<string>
对象才能通过它们枚举,因此制作了GetEnumAsStrings<T>()
方法。
但在我看来会有一种更简单的方法。
是否没有内置方法可将此类枚举转换为List<string>
?
using System;
using System.Collections.Generic;
namespace TestEnumForeach2312
{
class Program
{
static void Main(string[] args)
{
List<string> testModes = StringHelpers.GetEnumAsStrings<TestModes>();
testModes.ForEach(s => Console.WriteLine(s));
Console.ReadLine();
}
}
public static class StringHelpers
{
public static List<string> GetEnumAsStrings<T>()
{
List<string> enumNames = new List<string>();
foreach (T item in Enum.GetValues(typeof(TestModes)))
{
enumNames.Add(item.ToString());
}
return enumNames;
}
}
public enum TestModes
{
Test,
Show,
Wait,
Stop
}
}
谢谢大家,非常有见地。由于我最终需要 Silverlight 这个枚举似乎没有GetValues()
或GetNames()
,所以我创建了这个我从this method创建的方法:< / p>
public static List<string> ConvertEnumToListOfStrings<T>()
{
Type enumType = typeof(T);
List<string> strings = new List<string>();
var fields = from field in enumType.GetFields()
where field.IsLiteral
select field;
foreach (FieldInfo field in fields)
{
object value = field.GetValue(enumType);
strings.Add(((T)value).ToString());
}
return strings;
}
答案 0 :(得分:8)
你可以使用LINQ作为单行代码:
var enums = Enum.GetNames(typeof(TestModes)).ToList();
现在,请记住GetNames
会返回一个字符串数组......所以您甚至可能不需要ToList()
。
修改强>
有一些方法可以改进您编辑的代码。这是一个使用ToList
而不是显式实例化列表的简单的:
public static List<string> ConvertEnumToListOfStrings<T>()
{
Type enumType = typeof(T);
var fields = from field in enumType.GetFields()
where field.IsLiteral
select ((T)field.GetValue(enumType)).ToString();
return fields.ToList();
}
下一个是我个人的偏好。为什么要实例化一个列表呢?您可能只需要遍历名称,而不是从列表中添加或删除它们。所以只需使用IEnumerable
,根本不需要构建列表。为您节省一个(不可否认的是小)迭代和另一个对象的内存开销。
public static IEnumerable<string> GetEnumNames<T>()
{
Type enumType = typeof(T);
var fields = from field in enumType.GetFields()
where field.IsLiteral
select ((T)field.GetValue(enumType)).ToString();
return fields;
}
答案 1 :(得分:7)
因此,对于您的示例,它将是:
List<string> testModes = Enum.GetNames(typeof(TestModes)).ToList();
或者,如果你还在.NET 2.0中
List<string> testModes = new List<string>(Enum.GetNames(typeof(TestModes)));
如果你真的需要它作为List<string>
,否则我会直接使用数组。