基类具有类型为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)) }
{
}
}
(上面的代码无法编译,我相信初个化程序不接受数组。)
答案 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接受。)来实现它。