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

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

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

2. 实现自定义特性

  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>
    /// 测试结果
    /// </summary>
    [EquationResult(SaveName = "测试结果", 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.使用反射进行数据保存

 /// <summary>
    /// 获得要保存的数据
    /// </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); //写入数据流
          sw.Flush();
          for (int i = 0; i < listModel.Count; i++)
          {
            sw.BaseStream.Seek(0, SeekOrigin.End);
            data = GetSaveStr(listModel[i]);
            sw.WriteLine(data); //写入数据流
            sw.Flush();
          }
        }
      }
    }

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

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

(0)

相关推荐

  • 关于C#反射 你需要知道的

    通常,反射用于动态获取对象的类型.属性和方法等信息.今天带你玩转反射,来汇总一下反射的各种常见操作,捡漏看看有没有你不知道的. 获取类型的成员 Type 类的 GetMembers 方法用来获取该类型的所有成员,包括方法和属性,可通过 BindingFlags 标志来筛选这些成员. using System; using System.Reflection; using System.Linq; public class Program { public static voidMain() {

  • C#开发教程之利用特性自定义数据导出到Excel

    网上C#导出Excel的方法有很多.但用来用去感觉不够自动化.于是花了点时间,利用特性做了个比较通用的导出方法.只需要根据实体类,自动导出想要的数据 1.在NuGet上安装Aspose.Cells或者用微软自带类库也可以 2.需要导出的数据的实例类: using System.ComponentModel; using System.Reflection; using System.Runtime.Serialization; public class OrderReport { [Displa

  • C# 程序集和反射详解

    这里我又唠叨几句,大家在学习的时候,如看书或者看视频时觉得非常爽,因为感觉基本都看得懂也都挺容易的,其实看懂是一回事,你自己会动手做出来是一回事,自己能够说出来又是另一回事了.应该把学到的东西变成自己的东西,而不是依样画瓢. 在说反射之前,我们先来了解一下什么是程序集? 程序集 程序集是.net中的概念,程序集可以看作是给一堆相关类打一个包,相当于java中的jar包. 程序集包含: 资源文件 类型元数据(描述在代码中定义的每一类型和成员,二进制形式) IL代码(这些都被封装在exe或dll中)

  • C#高效反射调用方法类实例详解

    C#高效反射调用方法类 1.创建一个业务类(HomeService),在类下创建3个方法 2.正常方式调用类的方法 3.反射方式调用类的方法 4.调用代码 5.调用结果 6.Service类方法代码 内容扩展: 1.正常方式调用类的方法 /// <summary> /// 正常调用类的方法(parm1) /// </summary> /// <returns></returns> public string GetNormalMethod_2() { Hom

  • C# 使用反射来实现对象的深度复制方法

    实现方式 通过挨个罗列的方式一次复制子对象是非常耗费人力的,如果子对象是引用类型,则还要需要考虑是否对子对象进一步深拷贝. 实际应用中,一个类如果有几十个子对象,挨个复制对于开发人员来说索然无味比较费时费力. 所以使用反射机制来实现.   但是如果是服务端运行的话,还是建议手动的实现. 毕竟反射机制比直接写出来的效率要慢一些. 代码: public static class DeepCopyHelper { public static object Copy(this object obj) {

  • 详解C# 利用反射根据类名创建类的实例对象

    "反射"其实就是利用程序集的元数据信息. 反射可以有很多方法,编写程序时请先导入 System.Reflection 命名空间. 1.假设你要反射一个 DLL 中的类,并且没有引用它(即未知的类型): Assembly assembly = Assembly.LoadFile("程序集路径,不能是相对路径"); // 加载程序集(EXE 或 DLL) dynamic obj = assembly.CreateInstance("类的完全限定名(即包括命名空

  • C#使用反射(Reflect)获取dll文件中的类型并调用方法

    使用反射(Reflect)获取dll文件中的类型并调用方法,具体内容如下 需引用:System.Reflection; 1. 使用反射(Reflect)获取dll文件中的类型并调用方法(入门案例) static void Main(string[] args) { //dll文件路径 string path = @"D:\VS2015Project\001\Computer\bin\Debug\computer.dll"; //加载dll文件 Assembly asm = Assemb

  • C#基于Linq和反射实现数据持久化框架Xml4DB详解

    我们知道目前大部分的数据库都是关系型数据库, 所谓关系型数据库,就是指建立在关系模型 基础之上的数据库系统,如Oracle.SQL Server.Access.MySQL等.关系模型就是指二维表格模型,因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织.一个偶然的机会我接触到了DB4O,它是一个完全面向对象的开源数据库,它的出现完全颠覆了传统的数据库在人们心中的形象,因为传统的数据库需要在数据体.实体之间转换,而且需要映射文件提供映射关系.正是这个项目让我产生了编写Xml4DB的想

  • 详解C# 反射(Reflection)

    C# 反射(Reflection) 反射指程序可以访问.检测和修改它本身状态或行为的一种能力. 程序集包含模块,而模块包含类型,类型又包含成员.反射则提供了封装程序集.模块和类型的对象. 您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型.然后,可以调用类型的方法或访问其字段和属性. 优缺点 优点: 1.反射提高了程序的灵活性和扩展性. 2.降低耦合性,提高自适应能力. 3.它允许程序创建和控制任何类的对象,无需提前硬编码目标类. 缺点: 1.性能问题:使用反射基本

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

    最近在项目过程中遇到了保存数据的需求,对实体类的部分数据进行保存,打算采用反射+自定义特性来实现数据保存,利于扩展 1. 采用反射实现能够灵活获取要保存的数据,由于只需要保存实体类(Model)的部分数据,因此采用自定义特性标记需要保存的数据,同时数据要求以.csv格式保存,添加自定义特性有利于对表头进行描述 2. 实现自定义特性 public class ResultAttribute : Attribute { private bool _IsSave; /// <summary> ///

  • python保存数据到本地文件的方法

    1.保存列表为.txt文件 #1/list写入txt ipTable = ['158.59.194.213', '18.9.14.13', '58.59.14.21'] fileObject = open('sampleList.txt', 'w') for ip in ipTable: fileObject.write(ip) fileObject.write('\n') fileObject.close() 2.字典保存 #2/dict写入json import json dictObj =

  • Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法

    分享给大家供大家参考,具体如下:Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法.分享给大家供大家参考,具体如下: 首先我们创建一个python文件, tieba.py,我们要完成的是,输入指定百度贴吧名字与指定页面范围之后爬取页面html代码,我们首先观察贴吧url的规律,比如: 百度贴吧LOL吧第一页:http://tieba.baidu.com/f?kw=lol&ie=utf-8&pn=0 第二页: http://tieba.baidu.com/f?kw=lol

  • sql server动态存储过程按日期保存数据示例

    在项目中经常有大量数据信息保存到数据库,如只用一张表保存那肯定不现实,首选解决方案为按日期建立动态表来保存数据.在不改变保存方式的代码的情况下,用动态存储过程是首选,在sql server存储过程中进行日期计算,按日期建表效率最高,下面就公司项目的部分动态存储过程粘贴出来: -----sql语句: ALTER proc [dbo].[EventInsert] @chrTagData varchar(50), --编号 @intEData int, @chrJZData varchar(50),

  • Android 实现永久保存数据的方法详解

    背景:在Android中按照数据保存的方式,可以分为如下几种Content Provider (用的SQLite实现),SQLite,SharedPreferences(用的XML实现),文件,网络等方式. 今天在项目中,需要做一个永久保存的数据,保存到本地.于是测试了这几种保存方式.其中:SharedPreferences.SQLite.Content Provider 会在[设置]--[应用管理]--点击[清除数据]的时候,会删除文件.所以不安全.文件系统:如果SD卡坏了,或者拔掉的时候也会

  • 详解IOS四种保存数据的方式

    在iOS开发过程中,不管是做什么应用,都会碰到数据保存的问题.将数据保存到本地,能够让程序的运行更加流畅,不会出现让人厌恶的菊花形状,使得用户体验更好.下面介绍一下数据保存的方式: 1.NSKeyedArchiver:采用归档的形式来保存数据,该数据对象需要遵守NSCoding协议,并且该对象对应的类必须提供encodeWithCoder:和initWithCoder:方法.前一个方法告诉系统怎么对对象进行编码,而后一个方法则是告诉系统怎么对对象进行解码.例如对Possession对象归档保存.

  • C#根据反射和特性实现ORM映射实例分析

    本文实例讲述了C#根据反射和特性实现ORM 映射的方法.分享给大家供大家参考.具体如下: (一)关于反射 什么是反射? 反射就是在运行时,动态获取对象信息的方法.比如:运行时获得对象有哪些属性,方法,委托等. 反射的作用? 能够实现运行时,动态调用对象的方法,以及动态设置.获取属性值等. 反射的示例: using System; using System.Reflection; namespace CS_Test { public class MyStudent { private string

  • Python下载网络文本数据到本地内存的四种实现方法示例

    本文实例讲述了Python下载网络文本数据到本地内存的四种实现方法.分享给大家供大家参考,具体如下: import urllib.request import requests from io import StringIO import numpy as np import pandas as pd ''' 下载网络文件,并导入CSV文件作为numpy的矩阵 ''' # 网络数据文件地址 url = "http://archive.ics.uci.edu/ml/machine-learning

  • yii 框架实现按天,月,年,自定义时间段统计数据的方法分析

    本文实例讲述了yii 框架实现按天,月,年,自定义时间段统计数据的方法.分享给大家供大家参考,具体如下: 天(day): 格式Y-m-d 月(month):格式Y-m 年(year):格式Y 时间段(range): 格式Y-m-d 首先计算时间 天0-23小时 $rangeTime = range(0, 23); 月:1-月底 // $days = cal_days_in_month(CAL_GREGORIAN, $month, $year); $days = date("t",str

  • C#如何创建自定义特性

    概述 特性(Attribute)是用于在运行时传递程序中各种元素(比如类.方法.结构.枚举.组件等)的行为信息的声明性标签.您可以通过使用特性向程序添加声明性信息.一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的.要设计你自己的自定义特性,无需掌握许多新的概念. 如果你熟悉面向对象的编程,并且知道如何设计类,那么你已经具备大部分所需知识. 自定义特性本质上是直接或间接派生自 System.Attribute的传统类. 与传统类一样,自定义特性包含用于存储和检索数据的方法.

随机推荐