Кеширование всех объектов наследующих определенный класс - 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); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д