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