Flex自动填充属性值

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值