利用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实现高效的数据转换的主要内容,如果未能解决你的问题,请参考以下文章

C#反射技术的简单操作(读取和设置类的属性属性值)

C#反射技术的简单操作(读取和设置类的属性)

c#反射判判断某个对象的某个属性是不是string类型

CANN算子:利用迭代器高效实现Tensor数据切割分块处理

如何利用Python+系统剪贴板实现SAP报表数据高效导出

LIMS实现实验室管理与资源高效利用