今天在编程程序时,遇到一个使用“|”分割的数据,需要分割数据解析和组装成指定数据类型。先看这个问题需求场景:

数据是按如下格式组织的,

唯一标示|用户编号|用户名称|…

参数代码

参数说明

primaryKey

收费记录的唯一值,以防重复传输。

consNo

用户编号

consName

用户名称

orgNo

用户单位

rcvOrgNo

收款单位

acctOrgNo

清算单位编码

bankCode

收款机构

rcvAmt

收费金额

rcvedAmt

实收金额(不包含违约金)

rcvedPenalty

实收违约金

prepayAmt

预收金额

acctBal

用户余额(此条记录当时的余额,若无此余额,返回空值)

payDate

收费日期(精确到秒)

typeCode

收费类型(收费、冲正、退费等)

payMode

缴费方式(柜台收费,银行代收等)

settleMode

结算方式(现金,支票等)


实现解析算法:首先定义一个数据结构,由如上各字段组成,代码如下:


  1. public class PayInfo  
  2. {  
  3. public string primaryKey { get; set; }//收费记录的唯一值,以防重复传输。  
  4. public string consNo { get; set; }//用户编号  
  5. public string consName { get; set; }//用户名称  
  6. public string orgNo { get; set; }//用户单位  
  7. public string rcvOrgNo { get; set; }//收款单位  
  8. public string acctOrgNo { get; set; }//清算单位编码  
  9. public string bankCode { get; set; }//收款机构  
  10. public string rcvAmt { get; set; }//收费金额  
  11. public string rcvedAmt { get; set; }//实收金额(不包含违约金)  
  12. public string rcvedPenalty { get; set; }//实收违约金  
  13. public string prepayAmt { get; set; }//预收金额  
  14. public string acctBal { get; set; }//用户余额(此条记录当时的余额,若无此余额,返回空值)  
  15. public string payDate { get; set; }//收费日期(精确到秒)  
  16. public string typeCode { get; set; }//收费类型(收费、冲正、退费等)  
  17. public string payMode { get; set; }//缴费方式(柜台收费,银行代收等)  
  18. public string settleMode { get; set; }//结算方式(现金,支票等)  
  19. }  



然后将由|组织的数据转换为PayInfo数据,正常的思路是,按顺序解析值,并将值赋给对应的字段,实现的代码将如下:



  1. string[] strs = value.Split(split, StringSplitOptions.None);  
  2. PayInfo pay = new PayInfo();  
  3. pay.primaryKey = strs[0];  
  4. pay.consNo = strs[1];  
  5. //在下面实现所有字段的赋值操作  
  6. //此处省略相应的代码  


如果对应字段有跟多,全部写完,这个代码很长,读起来都很费劲,写的时候也容易出错。那么能不能让代码简单呢?答案一定是,下面看看如下代码:



  1. PayInfo pay = new PayInfo();  
  2. string[] split = { "|" };  
  3. string[] strs = value.Split(split, StringSplitOptions.None);  
  4. string[] fileds = {"primaryKey","consNo","consName","orgNo","rcvOrgNo","acctOrgNo","bankCode","rcvAmt","rcvedAmt","rcvedPenalty","prepayAmt","acctBal","payDate","typeCode","payMode","settleMode" };  
  5. for(int i=0;i<strs.Length;i++)  
  6. null);  



这个只用了6行代码就实现了数据的转换,代码的算法大家一看就明白,下面我简单说一下思路,如上代码主要理由Type.GetProperty方法,实现对C#类属性的赋值。