我有许多值对象,我希望能够在其中创建一个函数来跟踪属性和值,而无需直接指定它们。它允许我在所有值对象中使用相同的代码,而不是引用值对象中的变量。理想情况下,我想用这段代码替换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;
}
}
}
答案 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编码,因此保留字符(例如&
,=
等)应该不是问题。