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