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.)

¿Fue útil?

Solución

Es porque usted tiene que emitir el resultado de Enum.GetValues ??a la IEnumerable tipo apropiado. Ver aquí:

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.)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top