【发布时间】:2010-12-21 20:57:28
【问题描述】:
我正在使用 C# 开发游戏引擎。我正在处理的类称为CEntityRegistry,它的工作是跟踪游戏中CEntity 的许多实例。我的目标是能够查询具有给定类型的CEntityRegistry,并获得该类型的每个CEntity 的列表。
因此,我想做的是维护一张地图:
private IDictionary<Type, HashSet<CEntity>> m_TypeToEntitySet;
并因此更新注册表:
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);
}
}
我的问题是没有函数Type.GetAllBaseClassesAndInterfaces-我该怎么写呢?
【问题讨论】:
-
但您肯定不希望一个类型的实例也被视为一个实例,它的子类型和接口也是如此?
-
您是否考虑过使用 Type.IsAssignableFrom(Type) 可能比尝试映射每个 CEntity 的整个继承层次结构更简单一些?不确定您究竟打算如何使用存储库,但可能值得一看。
-
我想知道您是否最好将精力花在问自己为什么需要这样做以及是否有不需要反思的更直接的方法上。此外,保留所有这些对象的字典(如果您不小心实现它)可以防止它们被垃圾收集并导致程序中的内存泄漏。
标签: c# reflection inheritance types