我试图制作一个将枚举System.Array转换为这些枚举列表的通用函数,我不知道枚举数组的类型。我尝试了几种方法,但无法使其工作。就像这样...,谢谢
public static List<T> SArrayEnumToList<T>(System.Array arr){
Type enumType = typeof(T);
if(enumType.BaseType != typeof(Enum))
throw new ArgumentException("T must be of type System.Enum");
List<T> enumList = new List<T>(new T[arr.Length]);
int i;
for(i=0;i<arr.Length;i++) {
enumList.Add(( T )Enum.Parse(enumType, arr.GetValue(i).ToString()));
}
return enumList;
}
答案 0 :(得分:1)
假设您有int
的数组,我猜应该可以使用
public static List<T> SArrayEnumToList<T>(int[] arr) where T : struct, IConvertible
{
if (!typeof (T).IsEnum)
throw new ArgumentException("T must be of type System.Enum");
// cast to object first
return arr.Cast<object>()
.Cast<T>()
.ToList();
}
// or
public enum Test
{
blah,
balh2,
blah3
}
...
var results = ((Test[])(object)values).ToList();
答案 1 :(得分:1)
您实际上只需要使用Linq ToList()方法:
where.not
文档指出var myEnumsList = myEnumsArray.ToList();
返回一个列表“ ,其中包含来自输入序列的元素”。
如果您真的想将此功能分解为您自己的方法,可以按照以下步骤进行操作:
ToList()
泛型类型private static List<T> ToList<T>(T[] enums) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enum.");
}
return enums.ToList();
}
的约束类型限制了在调用方法时可以使用的类型。枚举是T
,并实现here中讨论的struct
。
编辑:
因为您确实需要使用System.Array。迭代System.Array,将每个值转换为通用类型IConvertible
,并在返回之前添加到列表。
工作示例:
T
编辑#2 发表评论后更新。
public static List<T> ToList<T>(Array array) where T : struct, IConvertible
{
if (!typeof(T).IsEnum)
{
throw new ArgumentException("T must be an enum.");
}
List<T> enumValues = new List<T>();
foreach (var enumValue in array)
{
enumValues.Add((T)enumValue);
}
return enumValues;
}