尝试在C#中将enum system.array转换为enum List <t>

时间:2018-10-08 08:09:39

标签: c# list enums

我试图制作一个将枚举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;
    }

2 个答案:

答案 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();

Full Demo Here

答案 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;
}