大家好!这是我的第一个博客
我希望我的这篇篇博客能够对您的学习、工作有些许帮助。好了,进入正题: 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()
{
}
}本文出自 “10321899” 博客,请务必保留此出处http://10331899.blog.51cto.com/10321899/1736342
原文:http://10331899.blog.51cto.com/10321899/1736342