前言:最近学习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;
}
}
相当于一个实操笔记,共勉!!!