ジェネリックコレクションとさまざまなタイプのリストオブジェクトを保存するにはどうすればよいですか?出来ますか?コレクションとリストは異なる種類のオブジェクトをどのように保存しますか?出来ますか?
コレクションとリストは、さまざまな型を格納する必要がある場合は、あなたが他のすべてのタイプと互換性のあることをタイプであるためにあなたのコレクションを宣言する必要がArrayListの
ジェネリックコレクションとさまざまなタイプのリストオブジェクトを保存するにはどうすればよいですか?出来ますか?コレクションとリストは異なる種類のオブジェクトをどのように保存しますか?出来ますか?
コレクションとリストは、さまざまな型を格納する必要がある場合は、あなたが他のすべてのタイプと互換性のあることをタイプであるためにあなたのコレクションを宣言する必要がArrayListの
ジェネリックコレクションの主な利点は、コレクションに保存する正確なタイプを指定でき、ボクシングが不要なことです。
あなたはここにいくつかのオプションがあります。
System.Collections
名前空間の非ジェネリックコレクションに固執します。IEnumerable<T>
に存在するすべての拡張メソッドを使用できます。の交換であるため。
例えば、リスト中のMemoryStream
とFileStream
の両方を置くために、あなたはList<Stream>
がある可能性がありますので:
List<Stream> streams = new List<Stream>();
streams.Add(new MemoryStream());
streams.Add(new FileStream(...));
複数の異なる種類について、あなたは限りList<object>
として行く必要がある場合があります。
List<object> objects = new List<object>();
objects.Add("hello"); // A String
objects.Add(5); // An Int32
objects.Add(new Button());
objects.Add(Guid.NewGuid());
この場合、値の型の値はボックス化されますが、特定の値型のリストには含まれません。
要素の型固有のメンバーを使用するには、要素が正しい型であることを確認してから型をキャストする必要があります。 is
キャスト、またはas
で:よく
string maybeString = objects[0] as string;
if (maybeString != null)
{
Console.WriteLine("String of length {0}", maybeString.Length);
}
、あなたはリストストア最も一般的な分母にする必要があります。何かを保存したい場合は、List<object>()
またはおそらくList<IMyCommonInterface>()
が必要です。
しかし、私の経験上、このようなコーディングが見つかった場合は、アーキテクチャーの再検討が必要な場合があります。
おそらく、達成しようとしているソリューションについて説明できますか?
私はいつも、「as」を介してタイプをチェックするのが一般に嫌な印象を受けましたか? –
@KyleBaran:はい、一般的には悪い考えです。単一のコレクション内に型を混在させるのは一般的には悪い考えです。しかし時々、それはすべての選択肢の中で最も悪いことです。 –