конвертировать из enum в IEnumerable

можете ли вы помочь мне hww, чтобы corect этот код

using System;
using System.Collections;
using System.Collections.Generic;
using System.Reflection;

namespace NTSoftHRM
{

    // ------------------------------------------------------------------------
    public class EnumValueList<T> : IEnumerable<T>
    {

        // ----------------------------------------------------------------------
        public EnumValueList()
        {
            IEnumerable<T> enumValues = GetEnumValues();
            foreach ( T enumValue in enumValues )
            {
                enumItems.Add( enumValue );
            }
        } // EnumValueList

        // ----------------------------------------------------------------------
        protected Type EnumType
        {
            get { return typeof( T ); }
        } // EnumType

        // ----------------------------------------------------------------------
        public IEnumerator<T> GetEnumerator()
        {
            return enumItems.GetEnumerator();
           // return ((IEnumerable<T>)enumItems).GetEnumerator();

        } // GetEnumerator

        // ----------------------------------------------------------------------
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        } // GetEnumerator

        // ----------------------------------------------------------------------
        // no Enum.GetValues() in Silverlight
        private IEnumerable<T> GetEnumValues()
        {
            List<T> enumValue = new List<T>();

            Type enumType = EnumType;

            return Enum.GetValues(enumType);

        } // GetEnumValues

        // ----------------------------------------------------------------------
        // members
        private readonly List<T> enumItems = new List<T>();

    } // class EnumValueList

} 

когда bulid ошибка: Не удается неявно преобразовать тип System.Массив 'to' системы.Коллекции.Родовой.IEnumerable". Существует явное преобразование (отсутствует приведение?) при возврате перечисления.GetValues (enumType)

3 ответов


проблема в вашей GetEnumValues метод перечисление.GetValues возвращает Array не IEnumerable<T>. Вы должны бросить его т. е.

Enum.GetValues(typeof(EnumType)).Cast<EnumType>();

    private IEnumerable<T> GetEnumValues()
    {
        Type enumType = EnumType;

        return Enum.GetValues(enumType).ToList<T>();
    } 

Я предполагаю, что эта строка бросает ошибку?:

return Enum.GetValues(enumType);

согласно сообщению об ошибке, вам не хватает приведения. Вы пробовали добавить гипс?:

return Enum.GetValues(enumType).Cast<T>();

на .GetValues() метод on Enum возвращает an Array. И хотя это то, над чем вы можете перечислить (он реализует IEnumerable), это не общее перечисление (это не реализовать IEnumerable<T> во время компиляции, хотя в документация указывает, что он будет доступен во время выполнения.).

для того, чтобы вернуть IEnumerable как IEnumerable<T> вы должны бросить его. Поскольку коллекции не всегда непосредственно ковариантны, есть удобный .Cast<T>() метод для преобразования коллекции.