c# 反射+自定义特性保存数据至本地

这篇文章主要介绍了c# 反射+自定义特性保存数据至本地的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下

最近在项目过程中遇到了保存数据的需求,对实体类的部分数据进行保存,打算采用反射+自定义特性来实现数据保存,利于扩展

1. 采用反射实现能够灵活获取要保存的数据,由于只需要保存实体类(Model)的部分数据,因此采用自定义特性标记需要保存的数据,同时数据要求以.csv格式保存,添加自定义特性有利于对表头进行描述

2. 实现自定义特性

 public class ResultAttribute : Attribute { private bool _IsSave; ///  /// 是否保存 ///  public bool IsSave { get { return _IsSave; } set { _IsSave = value; } } private string _SaveName; ///  /// .csv文件第一行的名称 ///  public string SaveName { get { return _SaveName; } set { _SaveName = value; } } }

3.Model类添加自定义标签

添加自定义标签后,反射过程中就能识别要保存的属性和.csv头名称

 public class TestResultModel:ViewModelBase { private int _TestNumber; ///  /// 序号 ///  [EquationResult(SaveName = "序号", IsSave = true)] public int TestNumber { get { return _TestNumber; } set { _TestNumber = value; RaisePropertyChanged(); } } private string _TestResult; ///  /// 测试结果 ///  [EquationResult(SaveName = "测试结果", IsSave = true)] public string TestResult { get { return _TestResult; } set { _TestResult = value; RaisePropertyChanged(); } } private DateTime _TestTime; ///  /// 测试时间 ///  [EquationResult(SaveName = "测试时间", IsSave = true)] public DateTime TestTime { get { return _TestTime; } set { _TestTime = value; RaisePropertyChanged(); } } private string _MeterSn; ///  /// 仪器SN号 ///  public string MeterSn { get { return _MeterSn; } set { _MeterSn = value; RaisePropertyChanged(); } } }	

4.使用反射进行数据保存

 ///  /// 获得要保存的数据 ///  ///  ///  /// 是不是第一行的表头 ///  private string GetSaveStr(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(); } ///  /// 保存测试信息 ///  ///  public void SaveTestDataToCsv(List 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 

5.使用反射获取属性列表时,列表的顺序可能会不一致,可以在自定义特性中加入排序特性,对每个属性设置排序值,反射获取属性列表后同时获取排序特性,根据排序特性对属性列表进行排序保证每次属性列表的顺序一致

以上就是c# 反射+自定义特性保存数据至本地的详细内容,更多关于c# 保存数据到本地的资料请关注html中文网其它相关文章!

以上就是c# 反射+自定义特性保存数据至本地的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » 其他教程