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

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

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

Здравствуйте, хотелось бы сохранять все новоиспеченные объекты, наследованные от некоего базового класса, в одном списке дабы не искать их по всему дереву. Типj такого:
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>();
Вручную прописывать HasSet под каждый класс уж очень не хочется. Нужно ли городить свой велосипед или есть уже проверенные временем решения?

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

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);
        }
    }
}

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


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

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

11   голосов , оценка 4 из 5
Похожие ответы