我有 Vector<ItemRenderer^>
。ItemRenderer
是一种抽象类型。我想过滤所有ConcreteRenderer
并对它们采取一些措施。
我尝试的是:
for each (auto renderer in m_parts)
if (renderer->GetType() == ConcreteRenderer::typeid)
{
auto item = dynamic_cast<ConcreteRenderer^>(renderer);
item->SetState(1);
}
,但是renderer
具有VectorProxy<ItemRenderer^>
类型,没有任何可行。如何修复它?
更新:
所以我使用了以下代码:
for each (auto renderer in m_parts)
{
auto item = dynamic_cast<ConcreteRenderer^>((ItemRenderer^)renderer);
if (item != nullptr)
item->SetState(1);
}
现在一切都很好。它是常见的解决方案,还是还有其他东西?
似乎您已经找到了正确的解决方案(对于每个元素,dynamic_cast to target类型,如果动态铸件返回了非编号,则该元素是预期类型的)。
您正在尝试的内容(p->GetType() == Thing::typeid
)无法正常工作,因为这些表达式都返回Platform::Type^
。由于这是一种句柄/指针类型,因此您正在执行指针比较(不是身份比较)。这基本上总是会在您的情况下返回false。
如果要使用类型身份而不是铸造来进行操作,则可以对类型对象上的FullName
属性进行比较。例如:if (p->GetType()->FullName == Thing::typeid->FullName)
。
但是,我相信Dynamic_cast解决方案通常具有更好的性能特征。(特别是因为如果您发现类型相同,则必须执行Dynamic_cast!)