利用反射初始化数值(这里比较特殊的使用为:列表和数组)
1.1应用场景:
目前碰到应用场景是在使用Json的文件的创建上,因为在根据类创建Json的时候,针对于空数组和空列表将会被忽略以“[]“空的形式存在,所以呢,所以呢,数组和列表的数据类型将会被忽略,所以需要对进行初始化。
1.2应用的函数
//该函数应用于判断某个类型是否继承于某个积累
if(typeof(IList).IsAssignableFrom(info.FieldType))....
2.1函数准备
Type type = Type.GetType(ClassName);
System.Object obj = FormatterServices.GetUninitializedObject(type);
//对其进行初始化
ReadClass(type, obj);
//导出Json(试试输出看看吧)
string Str = JsonUtility.ToJson(obj, true);
2.2ReadClass()解析
private static void ReadClass(Type type, System.Object EndObject)
{
//首先可以通过(获取所有的字段)
FieldInfo []infos = type.GetFields();
//首先判断是否为数组或列表
foreach (FieldInfo info in infos)
{
string TempTypeStr = info.FieldType.ToString();
//原因嘛,其实就是数组和列表都继承于IList
if(typeof(IList).IsAssignableFrom(info.FieldType))
{
//数组和链表的数据类型
//System.collection.Generic.List`1[System.Int32]
//System.Int32[]
//判断是否为数组
if(info.FieldType.IsArray)
{
//数组获取类型
string TypeStr = TempTypeStr.Substring(0,TempTypeStr.IndexOf('['));
Array_AddNum(obj , TypeStr);
}
//列表
else
{
//列表获取类型
string TypeStr = TypeName.Substring(TypeName.IndexOf('[') + 1, (TypeName.IndexOf(']') - TypeName.IndexOf('[')) - 1);
List_AddNum(obj , TypeStr);
}
}
//这里有两种(一种是值类型,一种是自定义类)
else
{
if(info.FieldType.IsClass)
{
Type TempType = Type.GetType(TempTypeStr);
object Tempobj = FormatterServices.GetUninitializedObject(TempType);
ReadClass(TempType, Tempobj);
info.SetValue(obj, Tempobj);
}
}
}
}
2.3添加数组和列表元素
//对数组进行添加元素
private object Array_AddNum(object obj , string TypeSrt)
{
if (TypeSrt == "System.Int32")
{
int[] TempArray = { 0 };
info.SetValue(EndObject, TempArray);
}
else if (TypeSrt == "System.String")
{
string[] TempArray = { "" };
info.SetValue(EndObject, TempArray);
}
else if (TypeSrt == "System.Boolean")
{
bool[] TempArray = { false };
info.SetValue(EndObject, TempArray);
}
//自定义类
else
{
Type TempType = Type.GetType(TypeSrt);
object value = FormatterServices.GetUninitializedObject(TempType);
Array array = Array.CreateInstance(TempType, 1);
//赋值
array.SetValue(value, 0);
info.SetValue(obj, array);
//递归遍历
ReadClass(TempType, value);
}
}
//对列表进行添加元素
private object List_AddNum(object obj , string TypeSrt)
{
if (TypeSrt == "System.Int32")
{
List<int> TempList = new List<int>();
Temp.Add(0);
info.SetValue(EndObject, Temp);
}
else if (TypeSrt == "System.Boolean")
{
List<bool> TempList = new List<bool>();
Temp.Add(false);
info.SetValue(EndObject, Temp);
}
else if (TypeSrt == "System.String")
{
List<string> TempList = new List<string>();
Temp.Add("");
info.SetValue(EndObject, Temp);
}
else
{
Type TempType = Type.GetType(TypeSrt);
object value = FormatterServices.GetUninitializedObject(TempType);
//准备列表
Type genericListType = typeof(List<>);
Type concreteListType = genericListType.MakeGenericType(TempType);
IList list = (IList)Activator.CreateInstance(concreteListType);
//赋值
list.Add(value);
info.SetValue(obj, list);
//递归遍历
ReadClass(TempType, value);
}
}