using System.Collections;
using System.Collections.Generic;
string name = "I am base";
public BaseClass(Type type) {
public class DerivedClass1 : BaseClass
string name = "I am derivedA";
public DerivedClass1(): base(Type.a) {
public class DerivedClass2 : BaseClass
string name = "I am derivedB";
public DerivedClass2() : base(Type.b)
public Dictionary<BaseClass.Type, List<BaseClass>> dict = new Dictionary<BaseClass.Type, List<BaseClass>>();
dict[BaseClass.Type.a] = new List<BaseClass>();
dict[BaseClass.Type.b] = new List<BaseClass>();
dict[BaseClass.Type.c] = new List<BaseClass>();
dict[BaseClass.Type.d] = new List<BaseClass>();
AddItem(new DerivedClass1());
AddItem(new DerivedClass1());
AddItem(new DerivedClass2());
AddItem(new DerivedClass2());
AddItem(new DerivedClass2());
public IEnumerable<T> GetEnumByType<T>(BaseClass.Type type) where T : BaseClass
if (dict.ContainsKey(type))
if (type == BaseClass.Type.a)
Console.WriteLine($"are equal: { object.ReferenceEquals(dict[type].Cast<T>(), dict[BaseClass.Type.a])}");
return dict[type].Cast<T>();
public void AddItem<T>(T item) where T : BaseClass
dict[item.type].Add(item);
static void Main(string[] args)
IEnumerable myList = foo.GetEnumByType<BaseClass>(BaseClass.Type.a);
Console.WriteLine($"areEqualRef: {object.ReferenceEquals(foo.dict[BaseClass.Type.a].Cast<BaseClass>(), foo.dict[BaseClass.Type.a])}");
Console.WriteLine($"areEqualRef: {object.ReferenceEquals(foo.dict[BaseClass.Type.a].Cast<DerivedClass1>(), foo.dict[BaseClass.Type.a])}");