Получить все статические переменные в классе - PullRequest
1 голос
/ 17 марта 2011

У меня есть класс ObjectType, который помогает мне сделать что-то вроде этого:

object.type = ObjectType.TWO

//ObjectType.as
package
{
    public class ObjectType
    {
        public static var ONE:String = "one";
        public static var TWO:String = "two";
        public static var THREE:String = "three";

        public function ObjectType()
        {
        }
    }
}

Давайте предположим, что я создаю новый класс, и мне нужно свойство с именем type.В этой функции набора свойств я хочу убедиться, что ее значение является одной из переменных ObjectType.Как мне этого добиться?

public function set type(value:String):void 
{
    for (var o:Object in ObjectType) {
        if (value == o)
            this._type = value;     
        } else {
            //error
        }
    }
}

Ответы [ 5 ]

6 голосов
/ 17 марта 2011

Не влияет на производительность, но без каких-либо изменений вы можете использовать функцию descriptionType , чтобы проверить статическое поле и получить значение обратно:

function valueInClass(clazz:Class, value:*):Boolean {
 return describeType(clazz).variable.(clazz[@name.toString()] == value).length() != 0
}

public function set type(value:String):void 
{
 if (valueInClass(ObjectType, value)) {
  this._type = value;     
 } else {
  //error
 }
}
2 голосов
/ 17 марта 2011

Полагаю, что второй пример кода, который вы представили, не работает ...

Я думаю, это потому, что вы используете for в цикле, немного неправильном.

for (var blah:String in somewhere){
    // blah represents a KEY of the somewhere object
    // to get the value of this key, use:
    var theValue = somewhere[blah];
}

Это для каждого цикла , который проходит через значения.Но сейчас я буду использовать для в .

Кроме того, это не in ObjectType, а скорее в прототипе класса, то есть in ObjectType.prototype.

Итак, чтобы исправить это:

for (var o:* in ObjectType.prototype) {
    if (value == ObjectType.prototype[o])
        this._type = value;     
    } else {
        //error
    }
}
1 голос
/ 17 марта 2011

Следует отметить, что хотя принятый ответ верен, он также очень медленный.Не то, что вы хотите сделать много.Есть три более простых решения.

Один: Проверьте само значение:

public function set type(value:String):void 
{
    if( value != ObjectType.ONE && value != ObjectType.TWO && value != ObjectType.THREE )
        return;
}

Очевидно, что чем больше у вас констант, тем сложнее проверить.

Два: Используйте в качестве констант целые числа

Измените класс ObjectType на использование целых чисел:

public class ObjectType
{
    public static var NONE:int = 0;
    public static var ONE:int = 1;
    public static var TWO:int = 2;
    public static var THREE:int = 3;
    public static var TOTAL:int = 4;
}

Обратите внимание на NONE и TOTAL втам?Это позволяет легко проверить, находится ли ваше значение в правильном диапазоне:

public function set type(value:int):void 
{
    if( value <= ObjectType.NONE || value >= ObjectType.TOTAL )
        return;
}

Вы можете добавить дополнительные значения по мере необходимости, вам просто нужно обновить TOTAL, и оно все равно будет работать.Это требует, чтобы каждое значение было по порядку.

Three: Использовать Enums

Хотя Flash не имеет встроенного класса для перечислений, существует множество доступных решений.Проверьте наш класс Enum от Скотта Биласа: http://scottbilas.com/blog/ultimate-as3-fake-enums/

Используя его в качестве базового класса, ваш класс ObjectType станет:

public final class ObjectType extends Enum
{

    { initEnum( ObjectType ); } // static ctor

    public static const ONE:ObjectType = new ObjectType;
    public static const TWO:ObjectType = new ObjectType;
    public static const THREE:ObjectType = new ObjectType;

}

И ваш чек теперь станет:

public function set type(value:ObjectType):void 
{
    ...
}

Здесь ваш установщик теперь становится безопасным по типу и будет выдавать ошибки, если используется что-то отличное от ObjectType.

1 голос
/ 17 марта 2011

Вы можете решить эту проблему с помощью отражения.

Подобный вопрос был задан всего несколько дней назад, вы должны иметь возможность использовать то же решение, найденное здесь .

0 голосов
/ 14 апреля 2016

Оказывается, что при использовании проверки типа ENUM вы должны проверять свойство константы , а не переменные , как показано в примере здесь: ActionScript - определите, является ли значение константой класса

...