c# 反射+自定义特性保存数据至本地
作者:ndtlyych 发布时间:2023-03-14 03:07:40
标签:c#,反射,自定义特性,保存数据
最近在项目过程中遇到了保存数据的需求,对实体类的部分数据进行保存,打算采用反射+自定义特性来实现数据保存,利于扩展
1. 采用反射实现能够灵活获取要保存的数据,由于只需要保存实体类(Model)的部分数据,因此采用自定义特性标记需要保存的数据,同时数据要求以.csv格式保存,添加自定义特性有利于对表头进行描述
2. 实现自定义特性
public class ResultAttribute : Attribute
{
private bool _IsSave;
/// <summary>
/// 是否保存
/// </summary>
public bool IsSave
{
get { return _IsSave; }
set { _IsSave = value; }
}
private string _SaveName;
/// <summary>
/// .csv文件第一行的名称
/// </summary>
public string SaveName
{
get { return _SaveName; }
set { _SaveName = value; }
}
}
3.Model类添加自定义标签
添加自定义标签后,反射过程中就能识别要保存的属性和.csv头名称
public class TestResultModel:ViewModelBase
{
private int _TestNumber;
/// <summary>
/// 序号
/// </summary>
[EquationResult(SaveName = "序号", IsSave = true)]
public int TestNumber
{
get { return _TestNumber; }
set { _TestNumber = value; RaisePropertyChanged(); }
}
private string _TestResult;
/// <summary>
/// 测试结果
/// </summary>
[EquationResult(SaveName = "测试结果", IsSave = true)]
public string TestResult
{
get { return _TestResult; }
set { _TestResult = value; RaisePropertyChanged(); }
}
private DateTime _TestTime;
/// <summary>
/// 测试时间
/// </summary>
[EquationResult(SaveName = "测试时间", IsSave = true)]
public DateTime TestTime
{
get { return _TestTime; }
set { _TestTime = value; RaisePropertyChanged(); }
}
private string _MeterSn;
/// <summary>
/// 仪器SN号
/// </summary>
public string MeterSn
{
get { return _MeterSn; }
set { _MeterSn = value; RaisePropertyChanged(); }
}
}
4.使用反射进行数据保存
/// <summary>
/// 获得要保存的数据
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="tClass"></param>
/// <param name="IsHead">是不是第一行的表头</param>
/// <returns></returns>
private string GetSaveStr<T>(T tClass, bool IsHead = false) where T : class
{
StringBuilder sb = new StringBuilder();
//msdn:GetProperties方法不按特定顺序(如字母顺序或声明顺序)返回属性。 你的代码不能依赖属性的返回顺序,因为该顺序会有所不同。
PropertyInfo[] infoarr = tClass.GetType().GetProperties();
foreach (var property in infoarr)
{
if (property.GetCustomAttribute(typeof(EquationResultAttribute), false) is EquationResultAttribute bute)
{
if (bute.IsSave && IsHead)
{
sb.Append(bute.SaveName + ",");
}
else if (bute.IsSave && !IsHead)
{
sb.Append(property.GetValue(tClass).ToString() + ",");
}
else
{
;//无代码
}
}
}
return sb.ToString();
}
/// <summary>
/// 保存测试信息
/// </summary>
/// <param name="listModel"></param>
public void SaveTestDataToCsv(List<TestDataModel> listModel)
{
using (FileStream fs = new FileStream(CsvSavePath, FileMode.OpenOrCreate, FileAccess.Write))
{
using (StreamWriter sw = new StreamWriter(fs,Encoding.Default))
{
sw.BaseStream.Seek(0, SeekOrigin.Begin); //设置流的起始位置为开始
string data = GetSaveStr(listModel[0], true); //写入第一行
sw.WriteLine(data); //写入数据流
sw.Flush();
for (int i = 0; i < listModel.Count; i++)
{
sw.BaseStream.Seek(0, SeekOrigin.End);
data = GetSaveStr(listModel[i]);
sw.WriteLine(data); //写入数据流
sw.Flush();
}
}
}
}
5.使用反射获取属性列表时,列表的顺序可能会不一致,可以在自定义特性中加入排序特性,对每个属性设置排序值,反射获取属性列表后同时获取排序特性,根据排序特性对属性列表进行排序保证每次属性列表的顺序一致
来源:https://www.cnblogs.com/ndtlyych/p/14139714.html
0
投稿
猜你喜欢
- 环境信息名称版本号Spring Boot2.4.5Idea2021.3.2服务端实现导入依赖<dependency>  
- 添加依赖<dependency> <groupId>com.belerweb
- 假定存在这样一种情况多个用户对数据库进行写,我们的业务逻辑规定,每个用户只能写一次,大部分用户也只发一次请求。public void wri
- SpringBoot集成Redis 1.添加redis依赖<dependency> <groupId
- 前言在这一期的文章中,我将继续介绍 Either,使用它构建树形结构,该结构允许我模拟 Scala 的模式匹配来构建遍历方法。在 Java
- Spring Boot 自动配置来看下 spring boot中自动配置的注解@SuppressWarnings("depreca
- 前言昨晚想在Android应用中增加一个int映射到String的字典表,使用HashMap实现的时候,Eclipse给出了一个警告,昨晚项
- @Autowired注入依赖失败的问题1、现象描述在Spring Boot项目中使用@Autowired注解,程序启动时发现服务启动失败,提
- 文章来源:互联网 作者:skywoo/CSDNWindows2000+Apache2.0.48+resin2.1.6 &nbs
- 本文实例讲述了C#编程之事务用法。分享给大家供大家参考,具体如下:ado.net2.0的SqlTransaction使用方法/////ado
- 背景接上文《失踪人口回归,mybatis-plus 3.3.2 发布》[1] ,提供了一个非常实用的功能 「数据安全保护」 功能,不仅支持数
- 主要功能设计:用户、区域、物质类型、物质详情、物质申请和审核以及我的申请和通知公告以及灵活控制菜单权限主要技术实现:spring、 spri
- 在开发过程中,不少有Spring Aop的使用,在面向切面编程时,我们会使用< aop:aspect>;在进行事务管理时,我们会
- 我们编程的过程中大部分使用了很出色的ORM框架,例如:MyBatis,Hibernate,SpringJDBC,但是这些都离不开数据驱动JD
- jar包就指第三方提供的开源的API,这些API不属于JDK的,需要通过导入才能使用。添加和导入的区别注意:本文里的 导入 和 添加 jar
- import java.io.*;import java.text.SimpleDateFormat;import java.util.*;
- 手机或照机拍摄的照片名称通常是”IMG_001.JPG”这种格式,这种文件名称是无意义的。使用照片拍摄时间命名可以让我们在多年以后查找照片时
- 首先,你可能会见到如下提示:File encoding is disabled because .properties file (see
- 首先利用IDEA创建Maven工程项目1.选择新建项目2.选中Maven骨架3.填写项目名称和项目位置4.Finsh之后默认打开的是pom.
- 建造者模式(Builder):将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。使用场景:当创建复杂对象的算法应该独