今天在编程程序时,遇到一个使用“|”分割的数据,需要分割数据解析和组装成指定数据类型。先看这个问题需求场景:
数据是按如下格式组织的,
唯一标示|用户编号|用户名称|…
参数代码 | 参数说明 |
primaryKey | 收费记录的唯一值,以防重复传输。 |
consNo | 用户编号 |
consName | 用户名称 |
orgNo | 用户单位 |
rcvOrgNo | 收款单位 |
acctOrgNo | 清算单位编码 |
bankCode | 收款机构 |
rcvAmt | 收费金额 |
rcvedAmt | 实收金额(不包含违约金) |
rcvedPenalty | 实收违约金 |
prepayAmt | 预收金额 |
acctBal | 用户余额(此条记录当时的余额,若无此余额,返回空值) |
payDate | 收费日期(精确到秒) |
typeCode | 收费类型(收费、冲正、退费等) |
payMode | 缴费方式(柜台收费,银行代收等) |
settleMode | 结算方式(现金,支票等) |
实现解析算法:首先定义一个数据结构,由如上各字段组成,代码如下:
- public class PayInfo
- {
- public string primaryKey { get; set; }
- public string consNo { get; set; }
- public string consName { get; set; }
- public string orgNo { get; set; }
- public string rcvOrgNo { get; set; }
- public string acctOrgNo { get; set; }
- public string bankCode { get; set; }
- public string rcvAmt { get; set; }
- public string rcvedAmt { get; set; }
- public string rcvedPenalty { get; set; }
- public string prepayAmt { get; set; }
- public string acctBal { get; set; }
- public string payDate { get; set; }
- public string typeCode { get; set; }
- public string payMode { get; set; }
- public string settleMode { get; set; }
- }
然后将由|组织的数据转换为PayInfo数据,正常的思路是,按顺序解析值,并将值赋给对应的字段,实现的代码将如下:
- string[] strs = value.Split(split, StringSplitOptions.None);
- PayInfo pay = new PayInfo();
- pay.primaryKey = strs[0];
- pay.consNo = strs[1];
-
-
如果对应字段有跟多,全部写完,这个代码很长,读起来都很费劲,写的时候也容易出错。那么能不能让代码简单呢?答案一定是,下面看看如下代码:
- PayInfo pay = new PayInfo();
- string[] split = { "|" };
- string[] strs = value.Split(split, StringSplitOptions.None);
- string[] fileds = {"primaryKey","consNo","consName","orgNo","rcvOrgNo","acctOrgNo","bankCode","rcvAmt","rcvedAmt","rcvedPenalty","prepayAmt","acctBal","payDate","typeCode","payMode","settleMode" };
- for(int i=0;i<strs.Length;i++)
- pay.GetType().GetProperty (fileds[i]).SetValue(pay, strs[i], null);
这个只用了6行代码就实现了数据的转换,代码的算法大家一看就明白,下面我简单说一下思路,如上代码主要理由Type.GetProperty方法,实现对C#类属性的赋值。