在ActionScript 3中是否有“自动方式”将“对象”强制转换为个性化的模型数据类型?
示例:
package Example{
public class ExampleModel{
private _id:int;
private _randomAttribute:String;
public function ExampleModel(){
_id = 0;
_randomAttribute = "";
}
public function get id():int{
return _id;
}
public function set id(value:int):void{
_id = value;
}
public function get randomAttribute():String{
return _randomAttribute;
}
public function set randomAttribute(value:String):void{
_randomAttribute = value;
}
}
}
然后,在我的代码的某些部分,让我们假设我有这样的东西:
var _obj:Object = new Object();
_obj.id = 1;
obj.randomAttribute = "Hello World";
我想要的是:
var _exampleModel:ExampleModel = obj as ExampleModel;
但是当我这样做时,_exampleModel上的结果为null。 有任何想法吗? 感谢。
编辑:
根据 Manish 的回答,我所改变的只是p var的类型,它允许我通过各种属性:
public function fromObject(obj:Object):void{
//p:* includes every type of attributes.
for (var p:* in obj)
if (this.hasOwnProperty(p))
// Set private var directly.
this["_" + p] = obj[p];
}
感谢 Manish 和 rcdmk 。 Manish的回答对我来说已经足够了,根据 rcdmk 的评论,p:String不是关于循环将经历的数据类型,它实际上是属性的名称,这是有道理的,因为每个名称都是字符串。
答案 0 :(得分:3)
自动“施放”它的唯一方法如下:
var model:Model = new Model();
var obj:Object = { id: "98123", name: "John Doe" };
for (var p:String in obj) {
if (model.hasOwnProperty(p))
model[p] = obj[p];
}
(注意:Model.id
和Model.name
在我的示例中都是String
类型。)
当然,更合适的方法是将普通对象传递给Model
对象,让Model
对象吸收它。
var model:Model = new Model(obj);
或者:
var model:Model = new Model();
model.fromObject(obj);
您拥有Model
代码的位置:
public function Model(obj:Object = null)
{
if (obj != null)
fromObject(obj);
}
public function fromObject(obj:Object):void
{
for (var p:String in obj)
if (this.hasOwnProperty(p))
// Set private var directly.
this["_" + p] = obj[p];
}
此代码可以在您的抽象基础Model
类中,您所有特定的Model
子类(例如ProductModel
,CustomerModel
等)都可以自动使用它。
e.g。
public class ProductModel extends Model
{
public function ProductModel(obj:Object = null)
{
super(obj);
}
}