Étant donné un Type C#, Obtenir de ses Classes de Base et mis en œuvre des Interfaces

Je suis en train de travailler sur un moteur de jeu en C#. La classe je suis en train de travailler sur est appelé CEntityRegistry, et son travail est de garder une trace du nombre d'instances de CEntity dans le jeu. Mon objectif est d'être en mesure d'interroger le CEntityRegistry avec un type donné, et d'obtenir une liste de chaque CEntity de ce type.

Ce que j'aimerais faire, donc, c'est de maintenir une carte:

private IDictionary<Type, HashSet<CEntity>> m_TypeToEntitySet;

Et de mettre à jour le registre ainsi:

private void m_UpdateEntityList()
        {
            foreach (CEntity theEntity in m_EntitiesToRemove.dequeueAll())
            {
                foreach (HashSet<CEntity> set in m_TypeToEntitySet.Values)
                {
                    if (set.Contains(theEntity))
                        set.Remove(theEntity);
                }
            }
            foreach (CEntity theEntity in m_EntitiesToAdd.dequeueAll())
            {
                Type entityType = theEntity.GetType();
                foreach (Type baseClass in entityType.GetAllBaseClassesAndInterfaces())
                  m_TypeToEntitySet[baseClass].Add(theEntity);

            }
        }

Le problème que j'ai c'est qu'il n'y a pas de fonction Type.GetAllBaseClassesAndInterfaces- Comment puis-je l'écrire?

  • mais vous ne voulez sûrement pas une instance d'un type à être compté comme une instance de tous les sous-types et les interfaces ainsi?
  • Apparemment, il n'.
  • Avez-vous considéré que l'utilisation de Type de.IsAssignableFrom(Type) peut faire de votre vie un peu plus simple que d'essayer de cartographier l'ensemble de la hiérarchie d'héritage de tous les CEntity? Pas sûr de ce que exactement comment exactement vous prévoyez sur l'utilisation du référentiel, mais il peut être quelque chose à regarder.
  • Je me demande si votre énergie ne serait pas mieux dépensé vous demander pourquoi cela est nécessaire et, s'il y a une approche plus directe qui ne nécessite pas de réflexion. Aussi, la tenue d'un dictionnaire de tous ces objets pourraient (si vous mettez en œuvre négligemment) les empêcher de jamais être nettoyés et provoquer une fuite de mémoire dans votre programme.
InformationsquelleAutor Mark P Neyer | 2009-12-01