欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

c# 反射+自定義特性保存數(shù)據(jù)至本地

 更新時間:2020年12月17日 08:48:46   作者:ndtlyych  
這篇文章主要介紹了c# 反射+自定義特性保存數(shù)據(jù)至本地的方法,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下

最近在項目過程中遇到了保存數(shù)據(jù)的需求,對實體類的部分數(shù)據(jù)進行保存,打算采用反射+自定義特性來實現(xiàn)數(shù)據(jù)保存,利于擴展

1. 采用反射實現(xiàn)能夠靈活獲取要保存的數(shù)據(jù),由于只需要保存實體類(Model)的部分數(shù)據(jù),因此采用自定義特性標記需要保存的數(shù)據(jù),同時數(shù)據(jù)要求以.csv格式保存,添加自定義特性有利于對表頭進行描述

2. 實現(xiàn)自定義特性

  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>
    /// 測試結(jié)果
    /// </summary>
    [EquationResult(SaveName = "測試結(jié)果", 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.使用反射進行數(shù)據(jù)保存

 /// <summary>
    /// 獲得要保存的數(shù)據(jù)
    /// </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); //寫入數(shù)據(jù)流
          sw.Flush();
          for (int i = 0; i < listModel.Count; i++)
          {
            sw.BaseStream.Seek(0, SeekOrigin.End);
            data = GetSaveStr(listModel[i]);
            sw.WriteLine(data); //寫入數(shù)據(jù)流
            sw.Flush();
          }
        }
      }
    }

5.使用反射獲取屬性列表時,列表的順序可能會不一致,可以在自定義特性中加入排序特性,對每個屬性設置排序值,反射獲取屬性列表后同時獲取排序特性,根據(jù)排序特性對屬性列表進行排序保證每次屬性列表的順序一致

以上就是c# 反射+自定義特性保存數(shù)據(jù)至本地的詳細內(nèi)容,更多關(guān)于c# 保存數(shù)據(jù)到本地的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • C# winform分頁查詢的實現(xiàn)示例

    C# winform分頁查詢的實現(xiàn)示例

    這篇文章主要介紹了C# winform分頁查詢的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-04-04
  • 深入分析C# Task

    深入分析C# Task

    這篇文章主要介紹了C# Task的相關(guān)資料,文中講解非常細致,代碼幫助大家更好的理解和學習C# Task的相關(guān)知識,感興趣的朋友可以了解下
    2020-08-08
  • C#中的out關(guān)鍵字用法詳解

    C#中的out關(guān)鍵字用法詳解

    在 C# 中,out 關(guān)鍵字是一個修飾符,它允許你在方法內(nèi)部創(chuàng)建一個臨時的變量,用于接收傳遞進來的參數(shù)值,并在方法執(zhí)行完畢后,將該變量的值返回給調(diào)用方法的對象,本文將給大家詳細介紹一下C#中的out關(guān)鍵字用法,需要的朋友可以參考下
    2024-02-02
  • C#打包部署并把.net framework框架打到安裝包的方法步驟

    C#打包部署并把.net framework框架打到安裝包的方法步驟

    打包c#程序時,有時需要添加.net framework組件到安裝包,本文就來介紹一下C#打包部署并把.net framework框架打到安裝包的方法步驟,具有一定的參考價值,感興趣的可以了解一下
    2023-10-10
  • 遍歷Hashtable 的幾種方法

    遍歷Hashtable 的幾種方法

    遍歷Hashtable 的幾種方法...
    2007-03-03
  • 基于C#實現(xiàn)端口掃描器(單線程和多線程)

    基于C#實現(xiàn)端口掃描器(單線程和多線程)

    本文主要介紹了基于C#分別通過單線程和多線程實現(xiàn)端口掃描,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • Winform實現(xiàn)調(diào)用asp.net數(shù)據(jù)接口實例

    Winform實現(xiàn)調(diào)用asp.net數(shù)據(jù)接口實例

    這篇文章主要介紹了Winform實現(xiàn)調(diào)用asp.net數(shù)據(jù)接口的方法,以實例的形式講述了數(shù)據(jù)接口及反射辨別響應的實現(xiàn)方法,具有一定的參考借鑒價值,需要的朋友可以參考下
    2014-10-10
  • 利用C#實現(xiàn)AOP常見的幾種方法詳解

    利用C#實現(xiàn)AOP常見的幾種方法詳解

    AOP面向切面編程(Aspect Oriented Programming),是通過預編譯方式和運行期動態(tài)代理實現(xiàn)程序功能的統(tǒng)一維護的一種技術(shù)。下面這篇文章主要給大家介紹了關(guān)于利用C#實現(xiàn)AOP常見的幾種方法,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-09-09
  • C#實現(xiàn)Word轉(zhuǎn)換RTF的示例代碼

    C#實現(xiàn)Word轉(zhuǎn)換RTF的示例代碼

    這篇文章主要為大家詳細介紹了如何利用C#實現(xiàn)Word轉(zhuǎn)換RTF,文中的示例代碼講解詳細,對我們學習C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下
    2022-12-12
  • Visual Stodio2022中沒有mysql.dll的解決辦法

    Visual Stodio2022中沒有mysql.dll的解決辦法

    這篇文章介紹了Visual Stodio2022中沒有mysql.dll的解決辦法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-12-12

最新評論