using System.Collections.Generic;
public static void Main()
var d = new Dictionary<int, Func<BaseClass>>(){{1, ()=> new SubClass1()},
{2, ()=>new SubClass2()}};
Console.WriteLine(d[1]().Name);
Console.WriteLine(d[2]().Name);
public abstract class BaseClass{
public abstract string Name {get;}
public class SubClass1 : BaseClass {
public override string Name { get{return "SubClass1";}}
public class SubClass2 : BaseClass {
public override string Name { get{return "SubClass2";}}