lista Inicializar de matriz utilizando una lista de inicialización
-
30-09-2019 - |
Pregunta
Una clase base tiene sólo lectura campo de tipo List<SomeEnum>
que las clases derivadas serán inicializar. Ahora, hay una clase derivada en la que quiero añadir los todos los valores de la SomeEnum . Una forma es escribir todos los valores de enumeración, pero la enumeración es un poco grande, así que hay alguna otra manera de hacerlo?
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)) }
{
}
}
(El código anterior se compila, creo intializers no aceptan matrices.)
Solución
Es porque usted tiene que emitir el resultado de Enum.GetValues ??a la IEnumerable
using System.Linq;
public class Derived : Base
{
public Derived()
: base(new List<SomeEnum>(Enum.GetValues(typeof(SomeEnum)).OfType<SomeEnum>()))
{
}
}
Otros consejos
A medida que Marcos escribió, hay un constructor que acepta una lista enumerable, tal vez usted puede aprovechar de la manera siguiente (menos enganchado):
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))
{
}
}
Eso no funcionará porque la colección inicializador llamadas Add
con su argumento, y no se puede añadir una matriz a una lista utilizando el método Add
(que había necesidad AddRange
en su lugar).
Sin embargo hay una constructor para List<T>
puede aceptar IEnumerable<T>
. Prueba esto:
new List<SomeEnum>((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)))
¿Usted ha intentado pasar la matriz de valores en el constructor de la lista, como esto:
public Derived() :
base(new List<SomeEnum>(Enum.GetValues(typeof(UserActions)))
{}
base(new List<SomeEnum>(((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)).GetEnumerator())))
Lo tengo trabajo por colada el empadronador regresó al tipo genérico (que acepta la lista.)