一直在做ArcGIS for flex的开发,在BaseWidget中总是根据XML的属性填充对象的属性值,或根据对象的属性值填充新的对象,总是写这些产生特别多的相似代码块。
设计了一个Util类,实现功能包括:
1.根据xml属性填充对象的属性;
2.根据已与对象的属性填充新对象的属性。
代码如下:
package com.common
{
import mx.controls.Alert;
import mx.utils.ObjectUtil;
public class ClassUtil
{
public function ClassUtil(){
}
/**
* 拷贝source中的属性到target,其中source可以是xml或object对象
*/
public static function copyProperties(source:Object ,target:Object ,ignoreFields:Array=null):void{
if(source==null||target==null){
return ;
}
if(source is XML){
copyXMLProperties(source as XML , target ,ignoreFields) ;
}else{
copyObjectProperties(source,target,ignoreFields) ;
}
}
/**
* 使用paramXML中属性到classObject对象中
*/
public static function copyXMLProperties(paramXML:XML,targetObject:Object,ignoreFields:Array=null):void{
if(targetObject==null||paramXML==null){
return ;
}
for each (var key:XML in paramXML.attributes()){
//忽略不需要替换的字段,或在classobject中没有的属性
if(!targetObject.hasOwnProperty(key.name())||
(ignoreFields!=null&&ignoreFields.indexOf(String(key.name()))>-1)){
continue ;
}
var propertyName:String = String(key.name()) ;
var value:String = String(paramXML.@[propertyName]) ;
//分别对基本类型进行处理
switch((typeof targetObject[propertyName])){
case "boolean":{
if(value.toUpperCase()=="TRUE"){
targetObject[propertyName] = true ;
}else{
targetObject[propertyName] = false ;
}
break;
}
case "number":{
targetObject[propertyName] = Number(value);
break;
}
default:{
targetObject[propertyName] = value ;
break;
}
}
}
}
/**
* 获取某个对象的属性名称
*/
public static function getObjectProperties(object:Object):Array{
if(object==null){
return null ;
}
var propertyArray:Array = ObjectUtil.getClassInfo(object).properties as Array;
if(propertyArray==null){
return null;
}
var targetFieldNames:Array = [] ;
for each (var property:Object in propertyArray) {
targetFieldNames.push(String(property.localName));
}
return targetFieldNames ;
}
/**
* 将源对象的所有属性复制到目标对象中的同名属性中,必须保证同名属性的类型相同
*/
public static function copyObjectProperties(sourceObject:Object,targetObject:Object,ignoreFields:Array=null):void{
if(sourceObject==null||targetObject==null){
return ;
}
var properties:Array = getObjectProperties(sourceObject);
if(properties==null){
return ;
}
var tempName:String = null ;
while(properties.length>0){
tempName = properties.pop() as String ;
//过滤targetObject没有的属性或设置忽略的字段
if(tempName==null || !targetObject.hasOwnProperty(tempName)||(ignoreFields!=null&&ignoreFields.indexOf(tempName)>-1)){
continue ;
}
targetObject[tempName] = sourceObject[tempName] ;
}
}
}
}