c# 反射+自定义特性保存数据至本地
最近在项目过程中遇到了保存数据的需求,对实体类的部分数据进行保存,打算采用反射+自定义特性来实现数据保存,利于扩展
1.采用反射实现能够灵活获取要保存的数据,由于只需要保存实体类(Model)的部分数据,因此采用自定义特性标记需要保存的数据,同时数据要求以.csv格式保存,添加自定义特性有利于对表头进行描述
2.实现自定义特性
publicclassResultAttribute:Attribute { privatebool_IsSave; //////是否保存 /// publicboolIsSave { get{return_IsSave;} set{_IsSave=value;} } privatestring_SaveName; //////.csv文件第一行的名称 /// publicstringSaveName { get{return_SaveName;} set{_SaveName=value;} } }
3.Model类添加自定义标签
添加自定义标签后,反射过程中就能识别要保存的属性和.csv头名称
publicclassTestResultModel:ViewModelBase { privateint_TestNumber; //////序号 /// [EquationResult(SaveName="序号",IsSave=true)] publicintTestNumber { get{return_TestNumber;} set{_TestNumber=value;RaisePropertyChanged();} } privatestring_TestResult; //////测试结果 /// [EquationResult(SaveName="测试结果",IsSave=true)] publicstringTestResult { get{return_TestResult;} set{_TestResult=value;RaisePropertyChanged();} } privateDateTime_TestTime; //////测试时间 /// [EquationResult(SaveName="测试时间",IsSave=true)] publicDateTimeTestTime { get{return_TestTime;} set{_TestTime=value;RaisePropertyChanged();} } privatestring_MeterSn; //////仪器SN号 /// publicstringMeterSn { get{return_MeterSn;} set{_MeterSn=value;RaisePropertyChanged();} } }
4.使用反射进行数据保存
//////获得要保存的数据 /// ////// /// 是不是第一行的表头 /// privatestringGetSaveStr (TtClass,boolIsHead=false)whereT:class { StringBuildersb=newStringBuilder(); //msdn:GetProperties方法不按特定顺序(如字母顺序或声明顺序)返回属性。你的代码不能依赖属性的返回顺序,因为该顺序会有所不同。 PropertyInfo[]infoarr=tClass.GetType().GetProperties(); foreach(varpropertyininfoarr) { if(property.GetCustomAttribute(typeof(EquationResultAttribute),false)isEquationResultAttributebute) { if(bute.IsSave&&IsHead) { sb.Append(bute.SaveName+","); } elseif(bute.IsSave&&!IsHead) { sb.Append(property.GetValue(tClass).ToString()+","); } else { ;//无代码 } } } returnsb.ToString(); } /// ///保存测试信息 /// ///publicvoidSaveTestDataToCsv(List listModel) { using(FileStreamfs=newFileStream(CsvSavePath,FileMode.OpenOrCreate,FileAccess.Write)) { using(StreamWritersw=newStreamWriter(fs,Encoding.Default)) { sw.BaseStream.Seek(0,SeekOrigin.Begin);//设置流的起始位置为开始 stringdata=GetSaveStr(listModel[0],true);//写入第一行 sw.WriteLine(data);//写入数据流 sw.Flush(); for(inti=0;i 5.使用反射获取属性列表时,列表的顺序可能会不一致,可以在自定义特性中加入排序特性,对每个属性设置排序值,反射获取属性列表后同时获取排序特性,根据排序特性对属性列表进行排序保证每次属性列表的顺序一致
以上就是c#反射+自定义特性保存数据至本地的详细内容,更多关于c#保存数据到本地的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。