Кеширование всех объектов наследующих определенный класс - C#

Узнай цену своей работы

Формулировка задачи:

Здравствуйте, хотелось бы сохранять все новоиспеченные объекты, наследованные от некоего базового класса, в одном списке дабы не искать их по всему дереву. Типj такого:
Листинг программы
  1. class BaseObject
  2. {
  3. }
  4. class Ball : BaseObject
  5. {
  6. }
  7. class RedBall : Ball
  8. {
  9. }
  10. class BlueBall : Ball
  11. {
  12. }
  13. class World
  14. {
  15. public List<T> GetAllObjectsOfType<T>() where T : BaseObject
  16. {
  17. ...
  18. }
  19. ...
  20. }
  21. var balls = world.GetAllObjectsOfType<Ball>();
  22. var redBalls = world.GetAllObjectsOfType<RedBall>();
Вручную прописывать HasSet под каждый класс уж очень не хочется. Нужно ли городить свой велосипед или есть уже проверенные временем решения?

Решение задачи: «Кеширование всех объектов наследующих определенный класс»

textual
Листинг программы
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Diagnostics;
  4. using System.Linq;
  5.  
  6. namespace NetExperimentsTwo
  7. {
  8.     class BaseObject
  9.     {
  10.  
  11.     }
  12.  
  13.     class Ball : BaseObject
  14.     {
  15.  
  16.     }
  17.  
  18.     class RedBall : Ball
  19.     {
  20.  
  21.     }
  22.  
  23.     class BlueBall : Ball
  24.     {
  25.  
  26.     }
  27.  
  28.     class World
  29.     {
  30.         private List<BaseObject> worldObjects = new List<BaseObject>();
  31.         private Dictionary<Type, object> worldObjectsCache = new Dictionary<Type, object>();
  32.  
  33.         public void BuildWorld()
  34.         {
  35.             this.worldObjects.Add(new Ball());
  36.  
  37.             this.worldObjects.Add(new RedBall());
  38.             this.worldObjects.Add(new RedBall());
  39.  
  40.             this.worldObjects.Add(new BlueBall());
  41.             this.worldObjects.Add(new BlueBall());
  42.             this.worldObjects.Add(new BlueBall());
  43.  
  44.         }
  45.  
  46.         public List<T> GetAllObjectsOfType<T>() where T : BaseObject
  47.         {
  48.             object objectList = null;
  49.            
  50.             if (this.worldObjectsCache.TryGetValue(typeof(T), out objectList)) {
  51.                 return (List<T>)objectList;
  52.             }
  53.  
  54.             var objects = this.worldObjects.Where(x => x.GetType() == typeof(T)).Cast<T>().ToList();
  55.             this.worldObjectsCache.Add(typeof(T), objects);
  56.  
  57.             return objects;
  58.         }
  59.     }
  60.  
  61.     class Program
  62.     {
  63.         static void Main(string[] args)
  64.         {
  65.             World world = new World();
  66.  
  67.             world.BuildWorld();
  68.  
  69.             List<Ball> b1 = world.GetAllObjectsOfType<Ball>();
  70.             List<Ball> b2 = world.GetAllObjectsOfType<Ball>();
  71.  
  72.             Debug.Assert(Object.ReferenceEquals(b1, b2));
  73.             Debug.Assert(b1.Count == 1);
  74.  
  75.             List<RedBall> rb1 = world.GetAllObjectsOfType<RedBall>();
  76.             List<RedBall> rb2 = world.GetAllObjectsOfType<RedBall>();
  77.  
  78.             Debug.Assert(Object.ReferenceEquals(rb1, rb2));
  79.             Debug.Assert(rb1.Count == 2);
  80.         }
  81.     }
  82. }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы