c# 反射+自定义特性保存数据至本地
作者:ndtlyych 时间:2023-03-14 03:07:40
最近在项目过程中遇到了保存数据的需求,对实体类的部分数据进行保存,打算采用反射+自定义特性来实现数据保存,利于扩展
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
标签:c#,反射,自定义特性,保存数据
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
详解微信开发之access_token之坑
2022-09-04 16:49:30
![](https://img.aspxhome.com/file/2023/7/126347_0s.png)
Java并发编程之同步容器
2023-03-10 16:34:29
![](https://img.aspxhome.com/file/2023/8/70308_0s.png)
Spring的@Value如何从Nacos配置中心获取值并自动刷新
2022-03-11 02:17:03
Android自定义控件仿QQ编辑和选取圆形头像
2022-11-10 09:40:37
![](https://img.aspxhome.com/file/2023/2/91012_0s.gif)
Android AIDL实现两个APP间的跨进程通信实例
2022-03-29 08:37:54
![](https://img.aspxhome.com/file/2023/4/137244_0s.png)
Mybatis-Plus分页的使用与注意事项
2022-08-14 22:00:56
![](https://img.aspxhome.com/file/2023/8/82378_0s.png)
Android短信验证码自动填充功能
2023-11-25 00:04:20
![](https://img.aspxhome.com/file/2023/0/138020_0s.png)
C#使用DLLImport调用外部DLL的方法
2022-07-17 04:41:18
Android ViewPager2 使用及自定义指示器视图实现
2022-06-16 09:35:26
Java利用自定义注解、反射实现简单BaseDao实例
2022-09-06 05:29:30
![](https://img.aspxhome.com/file/2023/5/125255_0s.png)
Java 实现FTP服务实例详解
2023-06-18 10:45:25
springboot中自定义异常以及定制异常界面实现过程解析
2023-05-13 09:14:00
![](https://img.aspxhome.com/file/2023/3/105913_0s.png)
C# WebApi 路由机制剖析
2022-01-23 05:20:16
![](https://img.aspxhome.com/file/2023/4/111184_0s.png)
详细聊聊C#的并发机制优秀在哪
2023-03-04 15:41:18
![](https://img.aspxhome.com/file/2023/3/119593_0s.png)
详解Java实践之建造者模式
2023-01-14 23:03:13
![](https://img.aspxhome.com/file/2023/1/65191_0s.jpg)
C# Split函数根据特定分隔符分割字符串的操作
2023-11-07 07:40:25
Android实现象棋游戏
2021-10-23 02:32:15
Android开发Jetpack组件WorkManager用例详解
2023-05-09 03:27:07
Java 图片与byte数组互相转换实例
2023-06-24 03:28:39
浅析Java内存模型与垃圾回收
2023-11-23 06:11:58
![](https://img.aspxhome.com/file/2023/5/59965_0s.png)