📚
【C#】Generic Typeの異なるListのCollectionを作る
List<float>とList<int>とList<string>と……を一つのCollectionにまとめたいときがある。しかし各ListのGeneric Typeが異なるためにそのまま某かのGeneric Collictionにすることはできない。List<List> はできないということだ。
そこでPublicな読み書きの関数はGenericで中身は非GenericのCollectionを作成することで解決できる。
using System.Collections.Generic;
public sealed class ListCollection : IEnumerable
{
readonly Dictionary<Type, IEnumerable> m_Lists = new Dictionary<Type, IEnumerable>();
public void Add<T>(List<T> list)
{
m_Lists.Add(typeof(T), list);
}
public bool TryGetValue<T>(out List<T> list)
{
if (m_Lists.TryGetValue(typeof(T), out var enumerable))
{
list = enumerable as List<T>;
return true;
}
else
{
list = null;
return false;
}
}
IEnumerator IEnumerable.GetEnumerator() => m_Lists.GetEnumerator();
}
初期化子に対応しているので以下のように使うことができる。
var lists = new ListCollection() { new List<float>(), new List<int>(), new List<string>() };
List<float> floats;
lists.TryGetValue(out floats);
Discussion