winrt 中的 C++/CX:在 Vector<ItemRenderer^ 中过滤特定类型>



我有 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!)

最新更新