Инициализировать список из массива, используя список инициализатора - PullRequest
1 голос
/ 07 января 2011

Базовый класс имеет только для чтения поле типа 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)) }
 {
 }
}

(Приведенный выше код не будет компилироваться, я полагаю, инициализаторы не принимают массивы.)

Ответы [ 5 ]

4 голосов
/ 07 января 2011

Это потому, что вы должны привести результат Enum.GetValues ​​к соответствующему типу IEnumerable .Смотрите здесь:

using System.Linq;


public class Derived : Base
{
    public Derived()
        : base(new List<SomeEnum>(Enum.GetValues(typeof(SomeEnum)).OfType<SomeEnum>()))
    {
    }
}
2 голосов
/ 07 января 2011

Как писал Марк, существует конструктор 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))
  { 
  }
} 
2 голосов
/ 07 января 2011

Это не сработает, потому что инициализатор коллекции вызывает Add с вашим аргументом, и вы не можете добавить массив в список с помощью метода Add (вместо этого вам потребуется AddRange).

Однако есть конструктор , для List<T> можно принять IEnumerable<T>.Попробуйте это:

new List<SomeEnum>((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)))
1 голос
/ 07 января 2011
base(new List<SomeEnum>(((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)).GetEnumerator())))

Я заработал, приведя перечислитель к возвращенному универсальному типу (который принимает List).

1 голос
/ 07 января 2011

Вы пытались передать массив значений в конструктор списка, например:

public Derived() : 
         base(new List<SomeEnum>(Enum.GetValues(typeof(UserActions))) 
{}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...