Кеширование всех объектов наследующих определенный класс - C#
Формулировка задачи:
Здравствуйте, хотелось бы сохранять все новоиспеченные объекты, наследованные от некоего базового класса, в одном списке дабы не искать их по всему дереву.
Типj такого:
Вручную прописывать HasSet под каждый класс уж очень не хочется. Нужно ли городить свой велосипед или есть уже проверенные временем решения?
class BaseObject
{
}
class Ball : BaseObject
{
}
class RedBall : Ball
{
}
class BlueBall : Ball
{
}
class World
{
public List<T> GetAllObjectsOfType<T>() where T : BaseObject
{
...
}
...
}
var balls = world.GetAllObjectsOfType<Ball>();
var redBalls = world.GetAllObjectsOfType<RedBall>();Решение задачи: «Кеширование всех объектов наследующих определенный класс»
textual
Листинг программы
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace NetExperimentsTwo
{
class BaseObject
{
}
class Ball : BaseObject
{
}
class RedBall : Ball
{
}
class BlueBall : Ball
{
}
class World
{
private List<BaseObject> worldObjects = new List<BaseObject>();
private Dictionary<Type, object> worldObjectsCache = new Dictionary<Type, object>();
public void BuildWorld()
{
this.worldObjects.Add(new Ball());
this.worldObjects.Add(new RedBall());
this.worldObjects.Add(new RedBall());
this.worldObjects.Add(new BlueBall());
this.worldObjects.Add(new BlueBall());
this.worldObjects.Add(new BlueBall());
}
public List<T> GetAllObjectsOfType<T>() where T : BaseObject
{
object objectList = null;
if (this.worldObjectsCache.TryGetValue(typeof(T), out objectList)) {
return (List<T>)objectList;
}
var objects = this.worldObjects.Where(x => x.GetType() == typeof(T)).Cast<T>().ToList();
this.worldObjectsCache.Add(typeof(T), objects);
return objects;
}
}
class Program
{
static void Main(string[] args)
{
World world = new World();
world.BuildWorld();
List<Ball> b1 = world.GetAllObjectsOfType<Ball>();
List<Ball> b2 = world.GetAllObjectsOfType<Ball>();
Debug.Assert(Object.ReferenceEquals(b1, b2));
Debug.Assert(b1.Count == 1);
List<RedBall> rb1 = world.GetAllObjectsOfType<RedBall>();
List<RedBall> rb2 = world.GetAllObjectsOfType<RedBall>();
Debug.Assert(Object.ReferenceEquals(rb1, rb2));
Debug.Assert(rb1.Count == 2);
}
}
}