.net 解析以竖线,美元符等分割符分割的字符串为实体
时间:2020-05-20
本文章向大家介绍.net 解析以竖线,美元符等分割符分割的字符串为实体,主要包括.net 解析以竖线,美元符等分割符分割的字符串为实体使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
一.需求:
交易返回的一大长串字符串:分项之间使用分割符‘|’分割。部分数据可能为空,如"xx||xx",即每一数据项的位置是固定的。
如果数据为多条,记录之间以‘$’分割。
例如:’xx|20200203|aaa1|$xx|20200104|aaa2|’.
二.分析 :
1. 多条记录,首先就要进行分隔成一个数组,然后再对数组中的数据进行处理。
2.使用split方法对一条数据进行分隔为一个数据,那索引位置就对应着一个数据项。
3.在建立的实体的属性上,添加一个定义的attribute来记录这个数据项对应的索引,如LocationAttribute。
4.通过反射获取对实体的所有属性,遍历属性集合,获取属性上的索引,即可得到这个数据实际的值。
5.再通过反射创建实体的实例,给实体的属性赋值。即可。
实现代码:
namespace Cis.Hus.Service.Utils { /// <summary>/// </summary> public class StringUtils { /// <summary> /// 解析单个字符串为对象T /// </summary> /// <typeparam name="T"></typeparam> /// <param name="source"></param> /// <returns></returns> public static T ParseOne<T>(string source) { string[] split = source.Split('|'); var accessor = new DynamicAccessor<T>(); T t = Activator.CreateInstance<T>(); var props = typeof(T).GetProperties(); foreach (var prop in props) { var p = prop.GetCustomAttributes(true).OfType<LocationAttribute>().FirstOrDefault(); if (p != null) { if (p.Column < split.Length) { var value = split[p.Column - 1]; var newValue = ChangeValueType(value, prop.PropertyType); accessor.SetValue(t, prop.Name, newValue); } } } return t; } /// <summary> /// /// </summary> /// <param name="value">要转换的值</param> /// <param name="conversionType">要转换成的类型</param> /// <returns></returns> private static object ChangeValueType(object value, Type conversionType) { if (conversionType.IsGenericType && conversionType.GetGenericTypeDefinition().Equals(typeof(Nullable<>))) { if (value != null) { NullableConverter nullableConverter = new NullableConverter(conversionType); conversionType = nullableConverter.UnderlyingType; } else { return null; } } return Convert.ChangeType(value, conversionType); } /// <summary> /// 将字符串数组解析为对象数组 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="source"></param> /// <returns></returns> public static List<T> Parse<T>(string[] source) { List<T> result = new List<T>(); var type = typeof(T).GetType(); //反射访问器 //TODO 测试一下,DynamicAccessor和 PropertyAccessor的性能差异 var accessor = new DynamicAccessor<T>(); for (int i = 0; i < source.Length; i++) { var one = ParseOne<T>(source[i]); result.Add(one); } return result; } /// <summary> /// 将字符串解析为对象数组 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="source"></param> /// <returns></returns> public static List<T> Parse<T>(string source) { //如果业务数据为多条记录,记录之间以‘$’分割 if (source.Contains("$")) { string[] items = source.Split('$'); return Parse<T>(items); } var obj = ParseOne<T>(source); return new List<T> { obj }; } } }
/// <summary> /// 插入定位attribute /// </summary> [AttributeUsage(AttributeTargets.Property | AttributeTargets.Class, AllowMultiple = false)] public class LocationAttribute : Attribute { #region Fields /// <summary> /// 列索引 /// </summary> public int Column { get; set; } #endregion }
调用:
List<User> data = StringUtils.Parse<User>(data);
原文地址:https://www.cnblogs.com/hankuikui/p/12923495.html
- demo3同通讯录展示的方式分组排序
- Android手势研究(textview及listview对比验证)
- demo2动态加载显示商品详情页
- demo1 动态显示view或弹框 动态隐藏view或弹框
- ios 继承UITableViewController,更改tableview样式
- demo1 动态显示view或弹框 动态隐藏view或弹框
- 从零开始的Spring Security Oauth2(一)
- 细说Android事件传递
- swift基础_ set get方法 理解
- 高仿今日头条(2)
- ios tableview 上加 textfiled
- Spring Cloud实战小贴士:Feign的继承特性(伪RPC模式)
- 仿淘宝购买详情页购买缩小动画
- 高仿今日头条(1)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- kubernetes-身份与权限认证(十四)
- kubernetes-控制器statefulset和Job(十三)
- kubernetes-存储卷(十二)
- kubernetes-配置管理(十一)
- ceph-mimic版
- kubernetes-ingress(十)
- kubernetes-控制器Deployment和DaemonSet(八)
- kubernetes集群网络
- kubernetes-深入理解pod对象(七)
- kubernetes-核心概念及创建应用(六)
- k8s1.13.0二进制部署-Dashboard和coredns(五)
- kubernetes监控-prometheus(十六)
- kubernetes监控-Heapster+InfluxDB+Grafana(十五)
- centos7 安装mysql5.7
- ceph-简介及安装(luminous)版