Попробуйте конвертировать enum system.array в enum List <T>в c # - PullRequest
0 голосов
/ 08 октября 2018

Я пытаюсь сделать универсальную функцию, которая преобразует перечисление 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 голосов
/ 08 октября 2018

Вам действительно нужно использовать метод Linq ToList () :

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 ограничивает, какие типы могут быть использованы при вызове метода.Enum является struct и реализует IConvertible, как описано в здесь .

РЕДАКТИРОВАТЬ:

Поскольку вам действительно нужно использовать System.Массив.Выполните итерацию System.Array, приведите каждое значение к универсальному типу T и добавьте в список перед возвратом.Рабочий пример:

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

РЕДАКТИРОВАТЬ # 2 Обновление после комментариев.

public static IList ToList(Array array)
{
    Type elementType = array.GetType().GetElementType();
    Type listType = typeof(List<>).MakeGenericType(new[] { elementType });
    IList list = (IList)Activator.CreateInstance(listType);
    foreach (var enumValue in array)
    {
        list.Add(enumValue);
    }
    return list;
}
0 голосов
/ 08 октября 2018

Если у вас есть массив 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();

Полная демонстрация здесь

...