一、开场白
一入开发深似海,再回首已非少年!
大家看到这个题目表喷我,不要说跟风吸睛(金庸老爷子去世)、标题党;好了,废话先不多说,进入正题。
二、场景描述
又到华山论剑之期,武林中各路高手为了武林盟主之位也好,天下第一之称也罢,都在进行最后的修炼。为了消除门派之见,允许各位大咖到不同门派修炼,每个门派一个月,限期一年。添加人员安排时,把各路高手错开,列表仅显示当前月所要修炼的门派。
图文并茂,先简单了解下,大概是先这样,然后那样,然后再这样。。。
1、添加高手高手高高手
第一位是一灯大师,当前是11月份,给一灯大师安排的是峨眉派的“修炼”。其它人员的参看列表,杨过这个月还是修炼“古墓派”的武功。
2、各个人员,修炼门派安排
好了,至此,场景介绍完毕。
3、简述下自己用的的表:人员表,门派表,人员门派安排表;每个表和一个实体类对应。人员表,门派表略过,都是姓名,id,创建日期这些基础参数,重点在人员门派安排表。
人员安排表字段:人员id,1月所属门派id,2月所练门派id。。。12月所练门派。参考下图:
三、问题来了
现在创建的门派人员关系数据已经保存好了,各个月份保存的是一个Guid类型的id。
按自己一贯的逻辑,搜索数据库,返回列表,循环遍历返回的对象列表,给json对象赋值,返回前端显示,over。等等,这个月是几月?11月,DateTime.Now.Month可以获取到。11月的英文是什么来着?November。嗯,dto.November获取到所属派别的id,再根据此获取门派名称;这样看似没问题,但是问题就出在这里:对象.属性(注意这个点已经加大),这个相当于动态获取对象的属性名称。10月的话应该是dto.October,11月应该是dto.November,当然其它月份又是对应的属性名称。如何动态获取属性名称,并取出对应属性的值呢。
四、反射登场
针对上面提到的问题,自己用到了枚举:各个月份对应。反射:根据当前月份,取出名称,在从对象中取出对应属性名称的值。代码如下(仅供参考)
枚举类型
1 /// <summary> 2 /// 月份 3 /// </summary> 4 enum Months 5 { 6 January = 1, 7 February, 8 March, 9 April, 10 May, 11 June, 12 July, 13 August, 14 September, 15 October, 16 November, 17 Desember 18 }
反射实现,这里已经引用了相应的程序集,没有动态添加。
1 /// <summary> 2 /// 获取所属考核门派:只显示当前月 3 /// </summary> 4 /// <param name="dto">人员</param> 5 /// <param name="dic">门户id,名称字典</param> 6 /// <returns></returns> 7 private string GetOrganization(OrganizationUserDTO dto, Dictionary<Guid, string> dic) 8 { 9 string orgName = ""; 10 int intMonth = DateTime.Now.Month; //获取当前月 11 string strMonth = Enum.GetName(typeof(Months), intMonth); //月份名称 12 Type t = dto.GetType(); 13 System.Reflection.PropertyInfo propertyInfo = t.GetProperty(strMonth); 14 Guid value = (Guid)propertyInfo.GetValue(dto, null); //获取属性值 15 try 16 { 17 if (value_Old != Guid.Empty) //初始化时未赋值 18 { 19 orgName = dic[value]; 20 } 21 } 22 catch (Exception ex) 23 { 24 Guid a = value; 25 } 26 return orgName; 27 }
接下来就是数据绑定,返回前台。
五、简单回顾
1、用到枚举,包括枚举中int和字符串如何转换。
2、反射技术,动态获取属性名称。
六、写在最后
之前只是知道反射,但是实际工作中并没有用到过,看相关的文章也是云里雾里,或者看过就网了。只有自己实际应用了才会有“原来如此”,豁然开朗的感觉。10月30号当天下午把这个存到了自己草稿箱,未编辑成文,为了避嫌,把实际的代码改成了武侠小说中的门派,人物,恰看到金庸老爷子的新闻,不胜感慨。仅以此文总结下反射,望能帮助那些还在纠结反射的童鞋们。当然,自己才疏学浅,有不足之处,还请各位指出。