最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

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

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

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類添加自定義標(biāo)簽

添加自定義標(biāo)簽后,反射過程中就能識別要保存的屬性和.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.使用反射進(jìn)行數(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);      //設(shè)置流的起始位置為開始
          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.使用反射獲取屬性列表時,列表的順序可能會不一致,可以在自定義特性中加入排序特性,對每個屬性設(shè)置排序值,反射獲取屬性列表后同時獲取排序特性,根據(jù)排序特性對屬性列表進(jìn)行排序保證每次屬性列表的順序一致

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

相關(guān)文章

  • C#中DataTable排序、檢索、合并等操作實例

    C#中DataTable排序、檢索、合并等操作實例

    這篇文章主要介紹了C#中DataTable排序、檢索、合并等操作實例,其中詳細(xì)介紹了DataTable.Select的一些注意問題和使用技巧等,需要的朋友可以參考下
    2014-04-04
  • 關(guān)于C# 類的封裝詳情

    關(guān)于C# 類的封裝詳情

    C#中可使用類來達(dá)到數(shù)據(jù)封裝的效果,這樣就可以使數(shù)據(jù)與方法封裝成單一元素,以便于通過,接下來小編將為大家詳細(xì)介紹,需要的朋友可以參考一下
    2021-10-10
  • C#校驗時間格式的場景分析

    C#校驗時間格式的場景分析

    本文通過場景分析給大家講解C#里如何簡單的校驗時間格式,本次的場景屬于比較常見的收單API,對第三方的訂單進(jìn)行簽名驗證,然后持久化到數(shù)據(jù)庫,需要的朋友跟隨小編一起看看吧
    2022-08-08
  • C#中DataTable 轉(zhuǎn)實體實例詳解

    C#中DataTable 轉(zhuǎn)實體實例詳解

    這篇文章主要介紹了C#中DataTable 轉(zhuǎn)實體實例詳解,需要的朋友可以參考下
    2017-04-04
  • C#訪問應(yīng)用程序配置文件的方法

    C#訪問應(yīng)用程序配置文件的方法

    C#訪問應(yīng)用程序配置文件的方法,需要的朋友可以參考一下
    2013-03-03
  • C#文件合并的方法

    C#文件合并的方法

    這篇文章主要介紹了C#文件合并的方法,實例分析了C#基于FileStream操作文件合并的相關(guān)技巧,需要的朋友可以參考下
    2015-07-07
  • 詳解TreeView綁定數(shù)據(jù)庫

    詳解TreeView綁定數(shù)據(jù)庫

    這篇文章主要演示了TreeView如何與數(shù)據(jù)庫進(jìn)行綁定
    2015-07-07
  • 解析C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)

    解析C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù)

    這篇文章主要介紹了C#中的私有構(gòu)造函數(shù)和靜態(tài)構(gòu)造函數(shù),是C#入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2016-01-01
  • C#交錯數(shù)組用法實例

    C#交錯數(shù)組用法實例

    這篇文章主要介紹了C#交錯數(shù)組用法,較為詳細(xì)的分析了交錯數(shù)組的概念、用法并實例分析了交錯數(shù)組的使用技巧,需要的朋友可以參考下
    2015-04-04
  • C#預(yù)定義的基礎(chǔ)類型轉(zhuǎn)換

    C#預(yù)定義的基礎(chǔ)類型轉(zhuǎn)換

    這篇文章介紹了C#預(yù)定義的基礎(chǔ)類型轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

肇源县| 鄯善县| 马尔康县| 时尚| 巧家县| 金乡县| 盐山县| 名山县| 墨玉县| 水富县| 惠来县| 巧家县| 衡阳县| 东港市| 义乌市| 抚宁县| 伊川县| 资源县| 凌云县| 蓬安县| 东乡| 西青区| 上犹县| 赞皇县| 扎兰屯市| 贵州省| 历史| 阿合奇县| 元氏县| 岳阳县| 光泽县| 墨江| 会理县| 锡林郭勒盟| 宁城县| 遂宁市| 临武县| 恩施市| 蒲城县| 老河口市| 连山|