zoukankan      html  css  js  c++  java
  • 杨过这个月修炼啥武功——反射获取

    一、开场白

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

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

    二、场景描述

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

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

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

  • 相关阅读:
    Maybe You Don't Know ! 如何比较两个引用是否指向同一个对象?
    记录一点项目心得...
    SharePoint 站点模版
    ObjectSpaces,See you in 2006...
    CLR如何实现线程同步
    Using 1.1, Waiting 2.0 & EasyThread
    在SharePoint中的Workflow引擎开发完成
    ViewState
    《WalkThrough WebPart 入门指南二》完成
    隐藏在.NET中的IoC?
  • 原文地址:https://www.cnblogs.com/meng9527/p/9881664.html
Copyright © 2011-2022 走看看