Ответ 1
Вы можете либо протестировать конкретный класс с помощью оператора "is", либо вы можете использовать flash.utils.getQualifiedClassName() (вы передаете ему свой объект) - который вернет строку с полным именем класса.
может кто-нибудь сказать мне, как я могу определить тип объекта в flex? В частности, у меня есть массив, в котором я храню несколько типов (но все UIComponents) сейчас, когда я оцениваю массив, который я хочу узнать, есть ли у меня TextInput Control или RadioButton. У кого-то есть идея?
Заранее спасибо
Вы можете либо протестировать конкретный класс с помощью оператора "is", либо вы можете использовать flash.utils.getQualifiedClassName() (вы передаете ему свой объект) - который вернет строку с полным именем класса.
ЕГО РАБОТА:)
Ниже приводится способ решения этой проблемы
switch( true )
{
case item is Customer_SF:
c = item as Customer_SF;
break;
case item is Opportunity:
o = item as Opportunity;
break;
case item is Product:
o = ( item as Product )._opportunity;
break;
default:
return true;
}
Оператор "есть" представляет собой один вариант.
Тогда существует оператор instanceof, который может или не может быть полезен в зависимости от ситуации.
Также существует класс ObjectUtil со статическим методом getClassInfo. Это возвращает больше, чем просто имя класса объекта.
Оператор "typeof", к сожалению, бесполезен для классов.
И, как уже сказал Бранден Холл, flash.utils.getQualifiedClassName().
Попробуйте использовать свойство className.
Он должен возвращать "TextInput" или "Button" в зависимости от случая
for each (var item:* in myArray)
{
if(item.hasProperty('className'))
{
trace("item ["+i+"] is :" + item['className']);
}
}
вот какой-то простой псевдокод, который демонстрирует, как использовать оператор is
для того, что вы хотите сделать:
for each (var item:* in myArray)
{
if (item is TextInput)
doSomethingWithTextInput(item as TextInput);
else if (item is RadioButton)
doSomethingWithRadioButton(item as RadioButton);
}
Эксплуатационные тесты is
для совместимости типов да. Из документов is
:
... оценивает, является ли объект совместимый с конкретным типом данных, класса или интерфейса. Используйте
is
вместоinstanceof
оператора для сравнения типов. Ты можешь также используйте операторis
для проверки реализует ли объект интерфейс.
Другими полезными операторами в этой категории являются typeof
(который возвращает строковое представление примитива), instanceof
(аналогично is
, но игнорирует совместимость с интерфейсом) и as
. Здесь доступен полный и полный список операторов ActionScript .
Надеюсь, что это поможет!
Лучше всего использовать оператор "is" и использовать что-то вроде:
for( var i:int = 0; i < componentArr.length; i++ )
{
var comp:UIComponent = componentArr[ i ];
if( comp is DataGrid )
// Handle DataGrid functionality here.
else if (comp is DropDown )
// Handle DropDown here
}
Однако существует одна проблема с этим подходом. Поскольку "is" вернет true для всех классов потомков, вы должны поместить все классы потомков перед своими предками. Список должен появиться перед ListBase. Это может вызвать некоторые неприятности.
// This is important to remember:
var mc:MovieClip = new MovieClip();
trace( mc is Sprite ); // true
Существует еще одна опция для случаев, когда объекты должны быть членами определенного класса (а не класса потомков): вы можете использовать свойство конструктора объекта и использовать оператор switch.
for( var i:int = 0; i < componentArr.length; i++ )
{
var klass:Class = componentArr[ i ].constructor;
switch( klass )
{
case DataGrid:
// Handle DataGrid
break;
case Text:
// Handle Text
break;
case NumericStepper:
// Handle NumericStepper
break;
default:
// Handle default
break;
}
}