当前位置: 首页 > news >正文

C#将类属性保存到Ini文件方法(利用拓展方法,反射方式获取到分组名和属性名称属性值)

前言:最近学习C#高级课程,里面学到了利用反射和可以得到属性的特性、属性名、属性值,还有拓展方法,一直想将学到的东西利用起来,刚好今天在研究PropertyGrid控件时,想方便一点保存属性值到配置文件,当然同理也可以保存对象的属性值到Xml文件 ,类似Json文件有JSON序列化保存更快,但是其中用到了反射技术,在属性多的情况下,性能会低一点. 后面有时间添加读取反序列化的.

IniHelper类代码如下,提供了读写方法接口

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;namespace Files
{public class IniHelper{[DllImport("kernel32")]private static extern int GetPrivateProfileString(string section, string key, string def, StringBuilder retVal, int size, string filePath);[DllImport("kernel32")]private static extern long WritePrivateProfileString(string section, string key, string val, string filePath);/// <summary>/// 泛型读取/// </summary>/// <typeparam name="T">值类型</typeparam>/// <param name="section">部分</param>/// <param name="key">键名</param>/// <param name="filePath">路径</param>/// <param name="Default">默认值</param>/// <returns></returns>public static T Read<T>(string section, string key, string filePath,T Default = default(T)){StringBuilder temp = new StringBuilder(255);GetPrivateProfileString(section, key,"", temp, 255, filePath);try{string[] str = temp.ToString().Split('%');if(str[0] != ""){return (T)(TypeDescriptor.GetConverter(typeof(T))).ConvertFromInvariantString(str[0]);}else{return (T)Default;}}catch (Exception err){return (T)Default;}}/// <summary>/// 普通读取/// </summary>/// <param name="section">部分</param>/// <param name="key">键名</param>/// <param name="filePath">路径</param>/// <param name="Default">默认值</param>/// <returns></returns>public static string Read(string section, string key, string filePath,string Default){StringBuilder temp = new StringBuilder(255);GetPrivateProfileString(section, key, "", temp, 255, filePath);string[] s = temp.ToString().Split(new char[] { '%' });if (s[0] != ""){return s[0].ToString();}else{return Default;}}/// <summary>/// 写入值/// </summary>/// <param name="section">部分</param>/// <param name="key">键名</param>/// <param name="value">值</param>/// <param name="filePath">路径</param>public static void Write(string section, string key, string value, string filePath){if(WritePrivateProfileString(section, key, value, filePath) <= 0){WritePrivateProfileString(section, key, value, filePath);}}/// <summary>/// Ini保存类属性分组,属性名,属性值到Ini文件/// </summary>/// <typeparam name="T">泛型对象</typeparam>/// <param name="t">具体泛型对象</param>/// <param name="filePath">文件完整路径</param>public static void SaveObj<T>(T t, string filePath,string DefaultSection = "Default") where T:class{Type type = t.GetType();foreach (var item in type.GetProperties()){string Section = item.PropertyGetCategoryAttribute() ?? DefaultSection;string Key = item.Name.ToString();string Value = item.GetValue(t).ToString();Write(Section, Key, Value, filePath);}}}
}

下面是拓展方法的代码如下

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;/// <summary>/// 属性拓展类/// </summary>public static class PropertyExpand{/// <summary>/// 通过属性 返回 其特性分组名/// </summary>/// <param name="propertyInfo">属性类型约束</param>/// <returns></returns>public static string PropertyGetCategoryAttribute(this PropertyInfo propertyInfo){var section = propertyInfo.GetCustomAttributes(typeof(CategoryAttribute), false);return section.Length > 0 ? ((CategoryAttribute)section[0]).Category : null;}}

相当于一个实操笔记,共勉!!!

http://www.dtcms.com/a/285278.html

相关文章:

  • vue-cli 模式下安装 uni-ui
  • 2-Vue3应用介绍
  • STM32f103ZET6之ESP8266模块
  • AlpineLinux的内核优化
  • AI搜索+GEO时代的营销策略更迭学习笔记
  • 计算机的网络体系及协议模型介绍
  • 【Java】文件编辑器
  • ROS1/Linux——Launch文件使用
  • 【深度学习新浪潮】AI在finTech领域有哪些值得关注的进展?
  • STM32 IAR 生成工程后配置
  • CSP-S模拟赛三(仍然是难度远超CSP-S)
  • 【Java源码阅读系列55】深度解读Java Method 类源码
  • 78、【OS】【Nuttx】【启动】caller-saved 和 callee-saved 示例:栈指针和帧指针(下)
  • 股票行情接口api,板块、概念接口,股票主力资金流接口,板块概念资金流接口
  • 暑期自学嵌入式——Day05(C语言阶段)
  • 1-创建Vue3项目
  • Linux系统编程——进程间通信
  • 融智兴科技: RFID超高频洗涤标签解析
  • LeetCode--48.旋转图像
  • 快速了解网络爬虫
  • 设备驱动的私有数据设计
  • yocto开发(1)----bitbake的全流程分析
  • 指针数组和数组指针的应用案例
  • js对象简介、内置对象
  • 聊聊数据和功能测试面临的挑战有哪些?
  • #systemverilog# 关键字之 变量声明周期与静态方法关系探讨
  • 美团外卖霸王餐接口对接具体操作步骤
  • NW972NW974美光固态闪存NW977NW981
  • 【读论文】AgentOrchestra 解读:LLM 智能体学会「团队协作」去解决复杂任务
  • 海思3516CV610 卷绕 研究