我有一个简单的AS3类,它只包含私有变量。每个私有变量都有一个getter函数,但并非所有私有变量都有setter函数。在运行时,有没有办法告诉哪些属性没有setter但是只读?然后我可以决定给用户一个输入字段来编辑具有setter的属性。
答案 0 :(得分:4)
将任何对象传递给describeType会返回包含有关对象的非常详细信息的XML。要知道它的readonly是否可以访问xml的以下节点,
xmlReturnedFromDescType.accessor.access
这将是三个中的一个,即 - readonly,writeonly和readwrite。
希望这有帮助。
答案 1 :(得分:2)
我建议describeType或try..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 );
}