使用初始化列表从数组初始化列表

时间:2011-01-07 07:24:22

标签: c# list initializer

基类具有类型为List<SomeEnum> readonly 字段,派生类将初始化该字段。现在,有一个派生类,我想在其中添加 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)) }
 {
 }
}

(上面的代码无法编译,我相信初个化程序不接受数组。)

5 个答案:

答案 0 :(得分:4)

这是因为你必须将Enum.GetValues的结果转换为适当的IEnumerable&lt; T&gt;类型。见这里:

using System.Linq;


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

答案 1 :(得分:2)

这不起作用,因为集合初始化程序使用您的参数调用Add,并且您无法使用Add方法向List添加数组(您需要AddRange而不是)。

List<T> IEnumerable<T>可以接受new List<SomeEnum>((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum))) 。试试这个:

{{1}}

答案 2 :(得分: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))
  { 
  }
} 

答案 3 :(得分:1)

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

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

答案 4 :(得分:1)

base(new List<SomeEnum>(((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)).GetEnumerator())))

我通过将枚举器转换为泛型类型(List接受。)来实现它。