你的位置:首页 > ASP.net教程

[ASP.net教程]通过反射获取数据库的数据 将其转化为相应类型的数据


反射可以动态获取数据的类型,Type 类可以获取其中的 字段、方法、属性等。 

尤其是将字段与属性做区分可以让我们可以获取,自己想获得的。废话不多说上代码。

先将数据导入的类,写下:

 1 using System; 2 using UnityEngine; 3  4 namespace ARPGSimpleDemo.Skill 5 { 6   /// <summary> 7   /// 技能数据 8   /// </summary> 9   [Serializable]10   public class SkillData11   {12     /// <summary>技能拥有者</summary>13     [HideInInspector]14     public GameObject Owner;15     /// <summary>技能编号</summary>16     public int skillID{set;get;}17     /// <summary>技能图标</summary>18     public string skillIcon { set;get;}19     /// <summary>描述</summary>20     public string description{set;get;} 21     /// <summary>技能名称</summary>22     public string name{set;get;}23     /// <summary>持续时间</summary>24     public float durationTime{set;get;} 25     /// <summary>在持续时间内,两次伤害之间的间隔时间</summary>26     public float damageInterval{set;get;}27     /// <summary>伤害比</summary>28     public float damage {set;get;} 29     /// <summary>冷却时间</summary>30     public int coolTime{set;get;}31     /// <summary>冷却剩余</summary>32     public int coolRemain;33     /// <summary>魔法消耗</summary>34     public int costSP{set;get;} 35     /// <summary>攻击距离</summary>36     public float attackDisntance{set;get;} 37     /// <summary>攻击目标</summary>38     [HideInInspector]39     public GameObject[] attackTargets;40     /// <summary>攻击目标的TAG</summary>41     public string[] attckTargetTags{set;get;}42     /// <summary>技能等级</summary>43     public int level{set;get;} 44     /// <summary>技能预制对象</summary>45     public GameObject skillPrefab;46     /// <summary>预制文件名</summary>47     public string prefabName{set;get;}48     /// <summary>攻击范围 线形,矩形,扇形,圆形</summary>49     public DamageMode damageMode{set;get;} 50     /// <summary>攻击类型,单攻,群攻</summary>51     public SkillAttackType attackType{set;get;}52     /// <summary>是否激活</summary>53     public bool Activated;54     /// <summary>技能对应的动画名称 </summary>55     public string animtionName{set;get;}56     /// <summary> 攻击范围角度</summary>57     public int attackAngle{set;get;}58     /// <summary>目标受击特效</summary>59     public string hitFxName{set;get;}60     public GameObject hitFxPrefab;61     /// <summary>下一个连击技能编号</summary>62     public int nextBatterId{set;get;}63  64    }65 }

下面是获取数据  并放入 

 1   /// <summary> 2   /// 将数据库数据放入技能管理类中 3   /// </summary> 4   /// <param name="jobId">职业ID</param> 5   void InitSkill(int jobId) 6   { 7     //先将数据库打开 8     OperatingDB.Instance.CreateDataBase(); 9     //遍历表中所有行10     SqliteDataReader skill = OperatingDB.Instance.db.ReadFullTable("T_Skill" + jobId);11     while (skill.Read())12     {13       SkillData sd = new SkillData();14       //反射获取15       Type t = typeof(SkillData);16       int i = 0;17       //遍历SkillData所有属性 t.GetProperties18       foreach (var item in t.GetProperties())19       {20         i++;21         //获取属性 判断 是否为 string22         if (item.PropertyType.Equals(typeof(string)))23           item.SetValue(sd, skill[i].ToString(), null); //赋值24         //获取属性 判断 是否为 float25         else if (item.PropertyType.Equals(typeof(float)))26           item.SetValue(sd, float.Parse(skill[i].ToString()), null);27         //获取属性 判断 是否为 string[]28         else if (item.PropertyType.Equals(typeof(string[])))29         {30           string[] str = skill[i].ToString().Split(',');31           item.SetValue(sd, str, null);32         }33         //获取属性 其余 其中枚举可以与int做转换34         else35           item.SetValue(sd, int.Parse(skill[i].ToString()), null);36       }37       //获取物体本身的技能管理类 将得到的类传入38       GetComponent<CharacterSkillManager>().skills.Add(sd);39     }40     //关闭数据库41     OperatingDB.Instance.db.CloseSqlConnection();42   }