c# 反射+自定義特性保存數(shù)據(jù)至本地
最近在項(xiàng)目過程中遇到了保存數(shù)據(jù)的需求,對實(shí)體類的部分?jǐn)?shù)據(jù)進(jìn)行保存,打算采用反射+自定義特性來實(shí)現(xiàn)數(shù)據(jù)保存,利于擴(kuò)展
1. 采用反射實(shí)現(xiàn)能夠靈活獲取要保存的數(shù)據(jù),由于只需要保存實(shí)體類(Model)的部分?jǐn)?shù)據(jù),因此采用自定義特性標(biāo)記需要保存的數(shù)據(jù),同時(shí)數(shù)據(jù)要求以.csv格式保存,添加自定義特性有利于對表頭進(jìn)行描述
2. 實(shí)現(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> /// 測試時(shí)間 /// </summary> [EquationResult(SaveName = "測試時(shí)間", 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方法不按特定順序(如字母順序或聲明順序)返回屬性。 你的代碼不能依賴屬性的返回順序,因?yàn)樵擁樞驎兴煌? 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í),列表的順序可能會不一致,可以在自定義特性中加入排序特性,對每個(gè)屬性設(shè)置排序值,反射獲取屬性列表后同時(shí)獲取排序特性,根據(jù)排序特性對屬性列表進(jìn)行排序保證每次屬性列表的順序一致
以上就是c# 反射+自定義特性保存數(shù)據(jù)至本地的詳細(xì)內(nèi)容,更多關(guān)于c# 保存數(shù)據(jù)到本地的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C# winform分頁查詢的實(shí)現(xiàn)示例
這篇文章主要介紹了C# winform分頁查詢的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-04-04C#打包部署并把.net framework框架打到安裝包的方法步驟
打包c(diǎn)#程序時(shí),有時(shí)需要添加.net framework組件到安裝包,本文就來介紹一下C#打包部署并把.net framework框架打到安裝包的方法步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10基于C#實(shí)現(xiàn)端口掃描器(單線程和多線程)
本文主要介紹了基于C#分別通過單線程和多線程實(shí)現(xiàn)端口掃描,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12Winform實(shí)現(xiàn)調(diào)用asp.net數(shù)據(jù)接口實(shí)例
這篇文章主要介紹了Winform實(shí)現(xiàn)調(diào)用asp.net數(shù)據(jù)接口的方法,以實(shí)例的形式講述了數(shù)據(jù)接口及反射辨別響應(yīng)的實(shí)現(xiàn)方法,具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2014-10-10C#實(shí)現(xiàn)Word轉(zhuǎn)換RTF的示例代碼
這篇文章主要為大家詳細(xì)介紹了如何利用C#實(shí)現(xiàn)Word轉(zhuǎn)換RTF,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)C#有一定的幫助,感興趣的小伙伴可以跟隨小編一起了解一下2022-12-12Visual Stodio2022中沒有mysql.dll的解決辦法
這篇文章介紹了Visual Stodio2022中沒有mysql.dll的解決辦法,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-12-12