大家好!这是我的第一个博客
我希望我的这篇篇博客能够对您的学习、工作有些许帮助。好了,进入正题: 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() { } }
转载于:https://blog.51cto.com/10331899/1736342