杨过这个月修炼啥武功——反射获取

一、开场白

  一入开发深似海,再回首已非少年!  

  大家看到这个题目表喷我,不要说跟风吸睛(金庸老爷子去世)、标题党;好了,废话先不多说,进入正题。

二、场景描述

  又到华山论剑之期,武林中各路高手为了武林盟主之位也好,天下第一之称也罢,都在进行最后的修炼。为了消除门派之见,允许各位大咖到不同门派修炼,每个门派一个月,限期一年。添加人员安排时,把各路高手错开,列表仅显示当前月所要修炼的门派。

   图文并茂,先简单了解下,大概是先这样,然后那样,然后再这样。。。

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号当天下午把这个存到了自己草稿箱,未编辑成文,为了避嫌,把实际的代码改成了武侠小说中的门派,人物,恰看到金庸老爷子的新闻,不胜感慨。仅以此文总结下反射,望能帮助那些还在纠结反射的童鞋们。当然,自己才疏学浅,有不足之处,还请各位指出。

原文地址:https://www.cnblogs.com/meng9527/p/9881664.html