0
点赞
收藏
分享

微信扫一扫

利用反射初始化实例化复杂类

萨摩斯加士奇 2022-01-09 阅读 81
jsonc#反射

利用反射初始化数值(这里比较特殊的使用为:列表和数组)

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);
    }
}



客官请放心食用(林寻)

举报

相关推荐

0 条评论