【问题标题】:In ActionScript 3, tracing all properties of a value object在 ActionScript 3 中,跟踪值对象的所有属性
【发布时间】:2010-09-06 01:00:37
【问题描述】:

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

}

}

【问题讨论】:

    标签: actionscript-3


    【解决方案1】:

    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 编码,因此保留字符(例如 &= 等)应该不是问题。

    【讨论】:

    • 哇,这很有帮助。我可以在许多项目中使用它,它会为我节省很多时间。我将不得不仔细研究一下才能弄清楚,但我在我的项目中对其进行了测试,并且效果很好。它是解析任何值对象并返回具有属性和值的 URLVars 的类。我很感激。有一个小错误:函数 getNameValuePairs 应该返回 URLVariables,而不是 Object。非常感谢您抽出时间用示例做出回应。
    • @mike。固定的!我最初写的代码是返回一个Object(后来改成了URLVariables,但是忘记改返回类型了)。我很高兴你觉得这很有帮助。如有必要,您可以调整它以返回不同格式的数据,但想法保持不变。你用 descrybeType 检查你的对象结构,然后缓存它(虽然没有必要,它很便宜并且可以提高性能),最后使用那个结构来检查实际的对象值。
    猜你喜欢
    • 2016-03-11
    • 2015-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多