19

你能帮我修改这段代码吗

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.Array”隐式转换为“System.Collections.Generic.IEnumerable”。返回 Enum.GetValues(enumType) 时存在显式转换(您是否缺少演员表?)

4

3 回答 3

55

问题出在您的GetEnumValues方法中,Enum.GetValues返回一个Arraynot an IEnumerable<T>。你需要投射它,即

Enum.GetValues(typeof(EnumType)).Cast<EnumType>();
于 2013-11-11T15:15:14.513 回答
4
    private IEnumerable<T> GetEnumValues()
    {
        Type enumType = EnumType;

        return Enum.GetValues(enumType).ToList<T>();
    } 
于 2013-11-11T15:15:39.073 回答
3

我认为这一行是引发错误的那一行?:

return Enum.GetValues(enumType);

根据错误消息,您缺少演员表。您是否尝试添加演员表?:

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

on.GetValues()方法Enum返回一个Array. 尽管它是您可以枚举的东西(它实现了IEnumerable),但它不是通用枚举(它在编译时实现,尽管文档表明它将在运行时可用。)。IEnumerable<T>

为了返回一个IEnumerable作为IEnumerable<T>你需要转换它。由于集合并不总是直接协变的,因此提供了一种方便的.Cast<T>()方法来转换集合。

于 2013-11-11T15:16:27.860 回答