利用C#的Type.GetProperty实现高效的数据转换
Posted wuyb_2004
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用C#的Type.GetProperty实现高效的数据转换相关的知识,希望对你有一定的参考价值。
今天在编程程序时,遇到一个使用“|”分割的数据,需要分割数据解析和组装成指定数据类型。先看这个问题需求场景:
数据是按如下格式组织的,
唯一标示|用户编号|用户名称|…
参数代码 | 参数说明 |
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#类属性的赋值。
以上是关于利用C#的Type.GetProperty实现高效的数据转换的主要内容,如果未能解决你的问题,请参考以下文章