因为对.net了解不是太深入,所以只能做出这样的水平:
找到要查找的反射属性信息:PropertyInfo^ getPropertyInfo(Type^ t, String^ pName) {
PropertyInfo^ pInfo; while (t != nullptr) { pInfo = t->GetProperty(pName, BindingFlags::DeclaredOnly | BindingFlags::Public | BindingFlags::Instance); if (pInfo != nullptr) { return pInfo; } t = t->BaseType; } return nullptr; } 从一个Component开始查找,然后查找其子Component是否有名为compName的控件,有则返回,无则返回nullptr// get a component by it's name, the component is in comp
Component^ getComponentByName(String^ compName, Component^ comp) { if (nullptr == comp) { return comp; } // if this component is the right one, then return it Type^ t = comp->GetType(); PropertyInfo^ pInfo = t->GetProperty("Name"); if (pInfo != nullptr && compName->Equals(dynamic_cast<String^>(pInfo->GetValue(comp, nullptr)))) { return comp; } // search this component's children Controls Component^ retComp; pInfo = getPropertyInfo(t, "Controls"); if (pInfo != nullptr) { System::Collections::IList^ list = safe_cast<System::Collections::IList^>(pInfo->GetValue(comp, nullptr)); if (list != nullptr) { for (int i = 0; i < list->Count; i++) { if (nullptr != (retComp = getComponentByName(compName, safe_cast<Component^>(list[i])))) { return retComp; } } } } // search this component's children Items pInfo = getPropertyInfo(t, "Items"); if (pInfo != nullptr) { System::Collections::IList^ list = safe_cast<System::Collections::IList^>(pInfo->GetValue(comp, nullptr)); if (list != nullptr) { for (int i = 0; i < list->Count; i++) { if (nullptr != (retComp = getComponentByName(compName, safe_cast<Component^>(list[i])))) { return retComp; } } } } return nullptr; }