一直在做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,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,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] ; } } } }