1

基类具有派生类将初始化的类型的只读字段。List<SomeEnum>现在,有一个派生类,我想在其中添加SomeEnum的所有值。一种方法是键入所有枚举值,但是枚举有点大,那么还有其他方法吗?

public class Base
{
 private readonly List<SomeEnum> _list;

 protected Base(List<SomeEnum> list)
 {
  _list = list;
 }
}

public class Derived : Base
{
 public Derived() : base(new List<SomeEnum>() { Enum.GetValues(typeof(SomeEnum)) }
 {
 }
}

(上面的代码不会编译,我相信初始化器不接受数组。)

4

5 回答 5

4

这是因为您必须将 Enum.GetValues 的结果转换为适当的 IEnumerable<T> 类型。看这里:

using System.Linq;


public class Derived : Base
{
    public Derived()
        : base(new List<SomeEnum>(Enum.GetValues(typeof(SomeEnum)).OfType<SomeEnum>()))
    {
    }
}
于 2011-01-07T07:39:35.563 回答
2

这不起作用,因为集合初始化程序Add使用您的参数调用,并且您不能使用该Add方法将 Array 添加到 List (您需要AddRange)。

但是有一个可以接受的构造函数。试试这个:List<T>IEnumerable<T>

new List<SomeEnum>((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)))
于 2011-01-07T07:27:00.350 回答
2

正如 Mark 所写,有一个 List 构造函数接受一个可枚举的,也许您可​​以通过以下(较少耦合)方式利用它:

public class Base 
{     
  private readonly List<UserActions> _list;      

  protected Base(IEnumerable<UserActions> values)
  {         _list = new List<UserActions>(values);  
  } 
}  

public class Derived : Base 
{     
   public Derived() : base((UserActions[]) Enum.GetValues(typeof(UserActions))
  { 
  }
} 
于 2011-01-07T07:31:48.393 回答
1

您是否尝试过在列表的构造函数中传递值数组,如下所示:

public Derived() : 
         base(new List<SomeEnum>(Enum.GetValues(typeof(UserActions))) 
{}
于 2011-01-07T07:28:10.800 回答
1
base(new List<SomeEnum>(((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)).GetEnumerator())))

我通过将枚举器转换为泛型类型(List 接受)来使其工作。

于 2011-01-07T07:51:41.537 回答