1

基本クラスには、派生クラスが初期化するタイプの読み取り専用フィールドがあります。さて、 SomeEnumList<SomeEnum>のすべての値を追加したい派生クラスがあります。1 つの方法はすべての列挙型の値を入力することですが、列挙型は少し大きいので、それを行う他の方法はありますか?

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)) }
 {
 }
}

(上記のコードはコンパイルされません。初期化子は配列を受け入れないと思います。)

4

5 に答える 5

4

これは、Enum.GetValues の結果を適切な IEnumerable<T> 型にキャストする必要があるためです。ここを参照してください:

using System.Linq;


public class Derived : Base
{
    public Derived()
        : base(new List<SomeEnum>(Enum.GetValues(typeof(SomeEnum)).OfType<SomeEnum>()))
    {
    }
}
于 2011-01-07T07:39:35.563 に答える
2

コレクション初期化子がAdd引数で呼び出され、メソッドを使用して配列をリストに追加できないため、これは機能しませんAdd(代わりに必要になりAddRangeます)。

ただし、 can accept のコンストラクターあります。これを試して:List<T>IEnumerable<T>

new List<SomeEnum>((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)))
于 2011-01-07T07:27:00.350 に答える
2

Mark が書いたように、enumerable を受け入れる 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))
  { 
  }
} 
于 2011-01-07T07:31:48.393 に答える
1

次のように、リストのコンストラクターに値の配列を渡そうとしましたか?

public Derived() : 
         base(new List<SomeEnum>(Enum.GetValues(typeof(UserActions))) 
{}
于 2011-01-07T07:28:10.800 に答える
1
base(new List<SomeEnum>(((IEnumerable<SomeEnum>)Enum.GetValues(typeof(SomeEnum)).GetEnumerator())))

返された列挙子をジェネリック型にキャストすることで機能させました(Listが受け入れます)。

于 2011-01-07T07:51:41.537 に答える