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

Actionscript 3 在ActionScript 3中,跟踪值对象的所有属性,actionscript-3,Actionscript 3,我有很多值对象,我希望能够在其中创建一个函数来跟踪属性和值,而无需直接指定它们。它允许我在所有值对象中使用相同的代码,而不是引用值对象中的变量。理想情况下,我希望用此代码替换blogURLVars中的代码 这是一个示例值对象 package items { public class Blog { private var _itemID:uint; private var _blogTitle:String; private var _blogText:String;

我有很多值对象,我希望能够在其中创建一个函数来跟踪属性和值,而无需直接指定它们。它允许我在所有值对象中使用相同的代码,而不是引用值对象中的变量。理想情况下,我希望用此代码替换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;
    }

}
}在这里可能会有所帮助。我把这个答案建立在另一个答案的基础上(你可能想看看):

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

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

使用:

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

在这里可能会有所帮助。我把这个答案建立在另一个答案的基础上(你可能想看看):

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

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

使用:


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

哇,这非常有用。我可以在很多项目中使用它,这将节省我很多时间。我将不得不采取更仔细的研究,以找出它,但我测试了它在我的项目,它的作品完美。它是一个解析任何值对象并返回带有属性和值的URLVars的类。我非常感激。有一个小错误:函数getNameValuePairs应该返回URLVariables,而不是Object。“我真的很感谢你抽出时间来回答这个例子。”迈克。固定的!我最初编写代码是为了返回一个对象(后来改为URLVariables,但忘记了更改返回类型)。我很高兴你觉得这很有帮助。如果有必要,您可以调整它以不同的格式返回数据,但想法保持不变。你用descrybeType检查你的对象结构,然后缓存它(虽然不是必需的,但它很便宜并且可以提高性能),最后用这个结构来检查实际的对象值。哇,这非常有用。我可以在很多项目中使用它,这将节省我很多时间。我将不得不采取更仔细的研究,以找出它,但我测试了它在我的项目,它的作品完美。它是一个解析任何值对象并返回带有属性和值的URLVars的类。我非常感激。有一个小错误:函数getNameValuePairs应该返回URLVariables,而不是Object。“我真的很感谢你抽出时间来回答这个例子。”迈克。固定的!我最初编写代码是为了返回一个对象(后来改为URLVariables,但忘记了更改返回类型)。我很高兴你觉得这很有帮助。如果有必要,您可以调整它以不同的格式返回数据,但想法保持不变。您可以使用descrybeType检查对象结构,然后缓存它(虽然不是必需的,但它很便宜并且可以提高性能),最后使用该结构检查实际的对象值。
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);