AS3:检测只读属性

时间:2010-08-26 21:04:11

标签: flex flash actionscript-3

我有一个简单的AS3类,它只包含私有变量。每个私有变量都有一个getter函数,但并非所有私有变量都有setter函数。在运行时,有没有办法告诉哪些属性没有setter但是只读?然后我可以决定给用户一个输入字段来编辑具有setter的属性。

5 个答案:

答案 0 :(得分:4)

将任何对象传递给describeType会返回包含有关对象的非常详细信息的XML。要知道它的readonly是否可以访问xml的以下节点,

xmlReturnedFromDescType.accessor.access

这将是三个中的一个,即 - readonly,writeonly和readwrite。

希望这有帮助。

答案 1 :(得分:2)

我建议describeTypetry..catch

答案 2 :(得分:1)

如前所述,您可以使用describeType()来返回XML对象将所有类型信息。但是,如果您对使用XML数据感到不舒服,可以使用AS3Commons的反射API - 反映:http://www.as3commons.org

以下是一个例子:

var type:Type = Type.forClass(MyClass);

for each (var accessor:Accessor in type.accessors) {
  if (accessor.writeable) {
    // do something with writeable property
  }
}

答案 3 :(得分:1)

另外,如果你碰巧对describeType进行了很多调用,你应该考虑使用DescribeTypeCache来提高awesomeness(以及速度)

答案 4 :(得分:0)

以下是从describeType中查找对象是否具有getter或setter的示例。

关键字:检测反射性getter setter discover

import flash.utils.describeType;

public static function hasSetter( subject : *, propName : String ) : Boolean
{
    var desc : XML = describeType( subject );
    var access : String = desc.accessor.(@name == propName).@access.toString();
    return ( access.indexOf( "write" ) > -1 );
}

public static function hasGetter( subject : *, propName : String ) : Boolean
{
    var desc : XML = describeType( subject );
    var access : String = desc.accessor.(@name == propName).@access.toString();
    return ( access.indexOf( "read" ) > -1 );
}

和tousdan的观点 - 如果你要做很多事情,那就创建一个缓存。 如果我不需要,我不喜欢包含mx库,所以我编写了这个简单的缓存:

public static function getTypeDescription( instance : * ) : XML
{
    var key : String = getSimpleClassName( instance );

    switch( true )
    {
        case ( typeDescriptions == null ) :
            typeDescriptions = new Object();
            typeDescriptions[ key ] = describeType( instance );
            break;
        case ( typeDescriptions[ key ] == null ) :
            typeDescriptions[ key ] = describeType( instance );
            break;
        case ( typeDescriptions[ key ] != null ) :
            // do nothing
            break;
        default :
            trace( "\tERROR : unhanded case DataUtils.getTypeDescription." );
            return null;
            break;
    }

    return typeDescriptions[ key ] as XML;
}

public static function getSimpleClassName( instance : * ) : String
{
    var className : String = String( getClass( instance ) );
    className = className.substring( 7, className.length - 1 );
    return( className );
}