0

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

现在一切正常。这是一个常见的解决方案,还是有别的?

4

1 回答 1

1

似乎您已经找到了正确的解决方案(对于每个元素,将 dynamic_cast 转换为目标类型,如果动态转换返回非 null,则该元素属于预期类型)。

您尝试的 ( p->GetType() == Thing::typeid) 不会起作用,因为这些表达式都返回 a Platform::Type^。由于这是句柄/指针类型,因此您正在执行指针比较(而不是标识比较)。在您的场景中,这基本上总是会返回 false。

如果你想通过使用类型标识而不是强制转换来做到这一点,你可以,但你应该FullName对类型对象的属性执行字符串比较。例如:if (p->GetType()->FullName == Thing::typeid->FullName)

但是,我相信 dynamic_cast 解决方案总体上会具有更好的性能特征。(特别是因为如果您确实发现类型相同,则无论如何您都必须执行该 dynamic_cast !)

于 2012-11-05T19:12:14.120 回答