前言
在解析LitJson 需要明确告诉JsonData类型和成员名字,这些写在代码中感觉比较死板,如果修改成员名和类型,解析JsonData也要改十分的麻烦,所以尝试使用C#的反射方法进行动态解析。
一、C#反射是什么?
具体可以去官网查看:反射
反射提供描述程序集、模块和类型的对象(Type 类型)。
二、用到的函数
1.Type.GetFields()
获得当前结构体或类的所有字段。
2. FieldInfo类
作用:发现字段的属性并提供对字段元数据的访问权限。
FieldInfo.FieldType //获取此字段对象的类型。
FieldInfo.SetValue(Object, Object) //对象的字段值设置为给定值。
FieldInfo.Name //获取当前成员的名称。
三.使用
using System;
using System.Reflection;
假定一个结构体
public struct Item
{
public int Num;
public float _float;
}
public Item OnLoadJsonData()
{
object DValue = "1";
Item _item = new Item();
FieldInfo[] fileInfos = typeof(Item).GetFields(); //得到结构体字段
Object Oitem = _item; //赋值的时候需要包装
//因为通过GetFields() 得到的字段是无序的所以要进行小小的比对
for(int i= 0;i<fileInfos.Length;i++)
{
for(int j =0;j<fileInfos.Length;j++)
{
if(fileInfos[i].Name == fileInfos[j].Name)
{
type _type = fileInfos[i].FieldType;
object Value = Convert.ChangeType(DValue, type);
fileInfos[i].SetValue(Oitem,Value);
}
}
}
//解包装
_item = (Item)Oitem;
return _item;
}
注意:如果结构体中有枚举类型,还需要进行区分。
//动态类型转换
Convert.ChangeType(Object, Type);
此函数无法进行枚举的类型转换,当然IConvertible 接口实现了,重写一个对枚举的类型转换。
总结
大概就这样了。
如果想泛型类的话,可以Item 换成 T,函数传一个类型参数进来进行判定,也是可以的。