大家好!这是我的第一个博客

 我希望我的这篇篇博客能够对您的学习、工作有些许帮助。好了,进入正题:

skillData是我自己创建的一个类。其中放了各式各样的数据。我尝试通过反射将数据库的数据转换为相应类型赋给skillData类
   
   
    /// <summary>
    /// 按照数据库中行数形成skillData列表
    /// </summary>
    /// <param name="tableName">数据表名</param>
    /// <returns></returns>
    public List<SkillData> GetAllSkill(string tableName)
    {
        List<SkillData> skills = new List<SkillData>();
        //获取相对职业表
        //tableName = "T_Skill" + CharacterTemplate.Instance.jobId;
        OperatingDB.Instance.CreateDataBase();
        //获取表行数  通过轮番查询数据实现
        SqliteDataReader sqReader = OperatingDB.Instance.db.ReadFullTable(tableName);
        int id = 0;
        while (sqReader.Read())
        {
       //在这个地方开始 每行执行赋值方法
            skills.Add(GetSkillData(id++));
        }
        OperatingDB.Instance.db.CloseSqlConnection();
        return skills;
    }
    /// <summary>
    /// 将数据库内元素转移到 skilldata中
    /// </summary>
    /// <param name="id">主键ID</param>
    /// <returns>skilldata </returns>
    SkillData GetSkillData(int id)
    {
       // 获取SkillData中所有变量名
        SkillData skillData = new SkillData();
        //获得类型
        Type type = skillData.GetType();
        //获取skillData类中所有字段
        FieldInfo[] fields = type.GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly);
        //遍历字段
        foreach (var item in fields)
        {
            //由于我在数据库中 没有Owner 所以跳过去
            if (item.Name != "Owner")
            {
                var itemName = item.Name;
                //先声明一个String 保存数值
                string itemValue;
                // 遍历所有变量 通过变量名 作为 表内键名 得到键值 
                // 这个方法在下面有具体内容
                PutSkillData("T_Skill1", id, itemName, out itemValue);
                // 通过变量名得到类型 将键值转换为相应类型 
                var itemType = item.FieldType;
                //如果未获取到相应值 跳过
                if (itemValue != null)
                {
                    switch (itemType.ToString())
                    {
                        //如果获得的将要转换的类型为GameObject[] / Switch 或者list
                        case "UnityEngine.GameObject[]":
                        将一个字符串通过‘,’分为字符串数值
                            var keyValues = itemValue.Split(',');
                            //这段是将它作为Tag寻找gameObject
                            List<GameObject> gameObjects = new List<GameObject>();
                            for (int i = 0; i < keyValues.Length; i++)
                            {
                                gameObjects.Add(GameObject.FindGameObjectWithTag(keyValues[i]));
                            };
                            //将此字段赋值为相应类型  
                            item.SetValue(skillData, gameObjects.ToArray());
                            break;
                        如果得到的是DamageMode
                        case "ARPGSimpleDemo.Skill.DamageMode":
                        
                            //枚举的值可以通过数值获得
                            //枚举如下:Circle = 1;
                            //          Angle = 2;
                            item.SetValue(skillData, int.Parse(itemValue));
                            Debug.Log("**********"+ item.Name);
                            break;
                        如果得到的是***类型 如上
                        case "ARPGSimpleDemo.Skill.SkillAttackType":
                            item.SetValue(skillData, int.Parse(itemValue));
                            //item.SetValue(skillAttackType, skillAttackType.GetEnumName(itemValue));
                            break;
                        其余情况 String int float
                        default:
                            //1)将值转为字段的目标类型 Convert.ChangeType(value,typeof(FieldInfo.FieldType))
                            var newValue = Convert.ChangeType(itemValue, item.FieldType);
                            //将键值赋给变量
                            item.SetValue(skillData, newValue);
                            break;
                    }
                    
                    //获取当前变量值
                    var fieldValue = item.GetValue(skillData);
                     Debug.Log("name: " + item.Name + "value: "+fieldValue );
                }
            }
        }
        return skillData;
    }
    /// <summary>
    /// 依次查询表内数据
    /// </summary>
    /// <param name="tableName">表名</param>
    /// <param name="id">ID</param>
    /// <param name="keyName">主键</param>
    /// <param name="value">值</param>
    void PutSkillData(string tableName, int id, string keyName, out string value)
    {
        value = null;
        OperatingDB.Instance.CreateDataBase();
        //查找数据 = 选择方法3(查询全表 取得表内全部数据)
        SqliteDataReader sqReader = OperatingDB.Instance.db.Select(tableName, "ID", "=", id.ToString());
        while (sqReader.Read())
        {
            int index = sqReader.GetOrdinal(keyName);
//            Debug.Log(index);
            if (index >= 0)
            {
                value = sqReader.GetValue(index).ToString();
//                Debug.Log(sqReader.GetOrdinal(keyName));
            }
        }
        OperatingDB.Instance.db.CloseSqlConnection();
    }
    void Types()
    {
    }
    
}