конвертировать из 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>()
метод для преобразования коллекции.