在ActionScript 3中,跟踪值对象的所有属性

时间:2010-09-06 01:00:38

标签: actionscript-3

我有许多值对象,我希望能够在其中创建一个函数来跟踪属性和值,而无需直接指定它们。它允许我在所有值对象中使用相同的代码,而不是引用值对象中的变量。理想情况下,我想用这段代码替换blogURLVars中的代码。

这是一个示例值对象

package items {

public class Blog {

    private var _itemID:uint;
    private var _blogTitle:String;
    private var _blogText:String;
    private var _blogCreated:String;
    private var _blogCategory:String;
    private var _blogFrontpage:Boolean;

    public function Blog (itemID:uint,blogTitle:String,blogText:String,blogCategory:String,blogCreated:String,blogFrontpage:Boolean=false) {

        _itemID = itemID;
        _blogTitle = blogTitle;
        _blogText = blogText;
        _blogCreated = blogCreated;
        _blogCategory = blogCategory;
        _blogFrontpage = blogFrontpage;
    }

    public function get itemID():uint {
        return _itemID;
    }

    public function get blogTitle():String {
        return _blogTitle;
    }

    public function get blogText():String {
        return _blogText;
    }

    public function get blogCategory():String {
        return _blogCategory;
    }

    public function get blogCreated():String {
        return _blogCreated;
    }

    public function get blogFrontpage():Boolean {
        return _blogFrontpage;
    }

    public function toString():void {

    }

    public function blogURLVars():String {
        var s:String;
        s = "itemID="+ _itemID;
        s += "blogTitle="+ _blogTitle;
        s += "blogText="+ _blogText;
        s += "blogCategory="+ _blogCategory;
        s += "blogCreated="+ _blogCreated;
        s += "blogFrontpage="+ _blogFrontpage;
        return s;
    }

}

}

1 个答案:

答案 0 :(得分:3)

DescrybeType可能会有所帮助。我将这个答案基于另一个答案(你可能想看一下):Fastest way to get an Objects values in as3

基本上,describeType函数可以让你检查对象的 public 接口。这意味着公共变量,getter / setter和方法(以及一些与您的问题无关的其他信息)。因此,您将获得所有getter的列表,并返回所述属性的名称以及给定对象的实际值。并不是说这与示例代码不完全相同,因为这不会使用私有变量,而是会调用getter。

在代码中,这可能是这样的(基于链接问题中的代码)。

package  {
    import flash.net.URLVariables;
    import flash.utils.describeType;
    import flash.utils.getQualifiedClassName;

    public class PropertiesHelper {

        public function PropertiesHelper() {

        }

        private static var typePropertiesCache:Object = {};

        public static function getPropertyNames(instance:Object):Array {
            var className:String = getQualifiedClassName(instance);
            if(typePropertiesCache[className]) {
                return typePropertiesCache[className];
            }
            var typeDef:XML = describeType(instance);
            trace(typeDef);
            var props:Array = [];
            for each(var prop:XML in typeDef.accessor.(@access == "readwrite" || @access == "readonly")) {
                props.push(prop.@name);
            }   
            return typePropertiesCache[className] = props;
        }

        public static function getNameValuePairs(instance:Object):URLVariables {
            var props:Array = getPropertyNames(instance);
            var vars:URLVariables = new URLVariables();
            for each(var prop:String in props) {
                vars[prop] = instance[prop];
            }
            return vars;
        }
    }

}

使用:

        var blog:Blog = new Blog(1,"title&","text","cat","created");
        var urlVars:URLVariables = PropertiesHelper.getNameValuePairs(blog);
        trace(urlVars);

我正在使用URLVariables对象,因为它似乎是您想要的(虽然实际上并不是blogURLVars方法所做的),但您可以在getNameValuePairs方法中将其更改为满足您的需求。使用URLVariables对象的一个​​优点是它会自动为您处理url编码,因此保留字符(例如&=等)应该不是问题。