利用C#的Type.GetProperty实现高效的数据转换

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

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

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

参数代码

参数说明

primaryKey

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

consNo

用户编号

consName

用户名称

orgNo

用户单位

rcvOrgNo

收款单位

acctOrgNo

清算单位编码

bankCode

收款机构

rcvAmt

收费金额

rcvedAmt

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

rcvedPenalty

实收违约金

prepayAmt

预收金额

acctBal

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

payDate

收费日期(精确到秒)

typeCode

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

payMode

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

settleMode

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


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

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

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

[csharp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  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. //此处省略相应的代码  
如果对应字段有跟多,全部写完,这个代码很长,读起来都很费劲,写的时候也容易出错。那么能不能让代码简单呢?答案一定是,下面看看如下代码:

[csharp]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  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.     pay.GetType().GetProperty (fileds[i]).SetValue(pay, strs[i], null);  

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值