通过反射获取数据库的数据 将其转化为相应类型的数据

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

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

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

 1 using System;
 2 using UnityEngine;
 3 
 4 namespace ARPGSimpleDemo.Skill
 5 {
 6     /// <summary>
 7     /// 技能数据
 8     /// </summary>
 9     [Serializable]
10     public class SkillData
11     {
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.GetProperties
18             foreach (var item in t.GetProperties())
19             {
20                 i++;
21                 //获取属性 判断 是否为 string
22                 if (item.PropertyType.Equals(typeof(string)))
23                     item.SetValue(sd, skill[i].ToString(), null); //赋值
24                 //获取属性 判断 是否为 float
25                 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                 else
35                     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     }

 

转载于:https://www.cnblogs.com/redUnity/p/5146920.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值