.Net实战之反射操作篇

1、上一讲中描述了反射中常见的类,仅仅是描述类与反射之间的关系。

  但是实际是对数据的操作,  在反射中,数据如何操作?

   [MyTable("T_UserInfo")]
    public class UserInfo : Person, UserService
    {
        private static string nickname;
        private int _age2;
        private int _age;
        [DisplayName("年龄")]
        public int Age
        {
            get
            {
                return _age;
            }
            set
            {
                _age = value;
            }
        }
        [DisplayName("姓名")]
        public string Name { get; set; }
        public void ShowUserInfo()
        {
            Console.WriteLine(string.Format("name:{0},age:{1}", Name, _age));
        }

        protected void ShowName()
        {
            Console.WriteLine("showName:" + Name);
        }
    }

UserInfo ui=null;//这样写,无论获取或设置数据,都会引发异常。

UserInfo ui=new UserInfo();//基于这种情况,我们必须创建类的实例,才能获取或设置数据。

既然反射与类有那么多的对应关系(上一讲图片),那么我们可以猜测,是不是获取到类的实例才能操作数据呢

于是就有了下图:

2、创建类的实例 一般用以下3种

--程序集指定类型名称

    UserInfo assCreateInstanceUser = ass.CreateInstance("ReflectionDemo.UserInfo") as UserInfo;                                              

   --Type类型创建

Type t = ass.GetType("ReflectionDemo.UserInfo", false, true);
UserInfo ActivatorUserInfo = Activator.CreateInstance(t) as UserInfo;//还可以CreateInstance(string assemblyName, string typeName)等方法

    --构造函数获取实例

            //获取无参数构造函数
            ConstructorInfo ci = t.GetConstructor(new Type[] { });
            //调用无参数构造函数,返回对象
            object obj = ci.Invoke(new object[] { });

            //获取有参数构造函数
            ConstructorInfo ci2 = t.GetConstructor(new Type[] { typeof(string)});
            //调用有参数构造函数(参数值与构造函数参数类型对应)
            object obj2 = ci2.Invoke(new object[] { "有参数name"});

--3、操作字段、属性、方法

            //==============字段
            //获取私有字段、存在于实例成员中如_age
            FieldInfo fiAge = t.GetField("_age", BindingFlags.NonPublic | BindingFlags.Instance);
            fiAge.SetValue(assCreateInstanceUser, 20);//设置字段_age的值为20
            Console.WriteLine("字段age===="+fiAge.GetValue(assCreateInstanceUser)); //获取字段_age值
            //nickname为静态,公有字段
            FieldInfo fiStatic = t.GetField("nickname", BindingFlags.Public | BindingFlags.Static);
            // fiStatic.SetValue(null, "hello");//静态字段可以传入对象或null
            //fiStatic.GetValue(null);//静态字段可以传入对象或null 

            //==============属性
            PropertyInfo pi = t.GetProperty("Name");//获取属性Name
            //t.GetProperty("Name", BindingFlags.Public | BindingFlags.Instance);//还可以设置位标记等
            pi.SetValue(assCreateInstanceUser, "zhangsan");//设置属性Name的值为zhangsan
            Console.WriteLine("属性Name====" + pi.GetValue(assCreateInstanceUser)); //获取属性Name值 

            //==============方法
            //公有方法
            MethodInfo miShowUserInfo = t.GetMethod("ShowUserInfo", new Type[] { });
            object retMethodObj = miShowUserInfo.Invoke(assCreateInstanceUser, new object[] { });
            //非公开方法,有返回值
            MethodInfo miGetUserInfo = t.GetMethod("GetUserInfo", BindingFlags.NonPublic|BindingFlags.Instance,null,new Type[] { },null);
            object retMethodObj2 = miGetUserInfo.Invoke(assCreateInstanceUser, new object[] { });

 --4、反射案例1 显示枚举Description

  public enum AuditStateEnum
    {
        [Description("等待审核")]
        WAIT_AUDIT = 1,
        [Description("审核通过")]
        PASS = 2,
        [Description("审核不通过")]
        NOT_PASS = 4
    }

非反射的做法一般如下:

        private void ShowEnumDesc()
        {
            BindEnumToDropdownlist(ddl1, typeof(AuditStateEnum));
        }

        private void BindEnumToDropdownlist(DropDownList ddl, Type enumType)
        {

            foreach (int i in Enum.GetValues(enumType))
            {
                ListItem li2 = new ListItem(Enum.GetName(enumType, i), i.ToString());
                ddl.Items.Add(li2);
            }
        }

反射的做法如下:

     private void BindEnumDescToDropdownlist(DropDownList ddl, Type enumType)
        {
            FieldInfo[] fiList = enumType.GetFields(BindingFlags.Public | BindingFlags.Static);
            foreach (FieldInfo fi in fiList)
            {
                DescriptionAttribute descAttr = fi.GetCustomAttribute(typeof(DescriptionAttribute), false) as DescriptionAttribute;
                if (descAttr != null)
                {
                    ddl.Items.Add(new ListItem(descAttr.Description,Convert.ToInt32(fi.GetValue(null)).ToString());
                }
            }
        }

       ---  

 --5、反射案例2 生成查询sql

  static string createQuerySql<TEntity>() where TEntity : class,new()
        {
            Type objType = typeof(TEntity);
            TEntity entity = new TEntity();
            var props =objType.GetProperties(BindingFlags.Public|BindingFlags.Instance);
            StringBuilder sbSql = new StringBuilder(" select ");
            foreach (var prop in props)
            {
                if (prop.CanWrite)
                {
                        sbSql.Append(","+prop.Name);
                }
            }
            sbSql.AppendFormat(" from {0}", objType.Name);
            string sql = sbSql.ToString();
            return sql.Remove(sql.IndexOf(‘,‘),1);
        }

 --6、mvc 特性过滤,打上ignoreCheck标签的controller或action无需权限校验

 public class IgnoreCheckAttribute : Attribute
    {
    }

 public class CheckRightAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            //是否无需校验
            if (filterContext.ActionDescriptor.IsDefined(typeof(IgnoreCheckAttribute), false))
            {

            }
            base.OnActionExecuting(filterContext);
        }

        public override void OnActionExecuted(ActionExecutedContext filterContext)
        {
            base.OnActionExecuted(filterContext);
        }

        public override void OnResultExecuting(ResultExecutingContext filterContext)
        {
            base.OnResultExecuting(filterContext);
        }

        public override void OnResultExecuted(ResultExecutedContext filterContext)
        {
            base.OnResultExecuted(filterContext);
        }
    } 

 --7、mvc生成强类型的表单,其实也和反射有关

总结: 

   这三篇文章都是实际工作中用的较多的一些知识点,希望对不太了解的人有所帮助

时间: 2024-07-30 23:46:22

.Net实战之反射操作篇的相关文章

病毒木马查杀实战第026篇:“白加黑”恶意程序研究(上)

前言 众所周知,传统的恶意程序都是由单一文件构成的,从而实现某一种或者几种恶意功能.而这类的恶意程序为了避免被发现以及被查杀,往往会采用五花八门的自我隐藏技术以及免杀技术,病毒程序的作者很多时候也是脑洞大开,为了对抗杀软的查杀也是无所不用其极.我们每天所处理的恶意文件里面,反查杀手段运用得最好的就是脚本木马,关于这类程序,我在之前的<病毒木马查杀实战第025篇:JS下载者脚本木马的分析与防御>这篇博文中也做过简单的论述.可是,不论恶意程序如何进化,杀软厂商总有各种各样的方法来应对现有的以及未知

HTML5 Canvas(画布)实战编程初级篇:基本介绍和基础画布元素

欢迎大家阅读HTML5 Canvas(画布)实战编程初级篇系列,在这个系列中,我们将介绍最简单的HTML5画布编程.包括: 画布元素 绘制直线 绘制曲线 绘制路径 绘制图形 绘制颜色,渐变和图案 绘制图片 绘制文本 相关要求 环境要求:Google Chrome, Firefox, Safari, Opera, 或者 IE9以上的现代浏览器 编程要求:需要有基础的HTML和Javascript编程经验,相关的画布编程将调用Javascript API来处理 HTML Canvas基本元素 HTM

xgboost入门与实战(原理篇)

http://blog.csdn.net/sb19931201/article/details/52557382 xgboost入门与实战(原理篇) 前言: xgboost是大规模并行boosted tree的工具,它是目前最快最好的开源boosted tree工具包,比常见的工具包快10倍以上.在数据科学方面,有大量kaggle选手选用它进行数据挖掘比赛,其中包括两个以上kaggle比赛的夺冠方案.在工业界规模方面,xgboost的分布式版本有广泛的可移植性,支持在YARN, MPI, Sun

Docker虚拟化实战学习——基础篇(转)

Docker虚拟化实战学习--基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker Docker虚拟化实战和企业案例演练 深入剖析虚拟化技术概念和应用场景 虚拟化,一是项技术--,是一种资源解决方案. 虚拟化技术是将物理资源转变为逻辑上可以管理的资源,以打破物理结构之间的壁垒,使计算元件运行在虚拟的基础上,而不是真实的物理资源上. 通过虚拟化技术,可以将物理资源转变为逻辑资源(虚拟机),应用程序服务运行在虚拟资源上,而不是真实的物理机上.

[徐培成系列实战课程]-docker篇-前序

[徐培成系列实战课程]docker篇如何利用docker快速构建Spark独立模式的集群1.介绍利用docker容器技术快速构建跨节点的独立模型的Spark大数据集群.Spark是时下非常热门的大数据计算引擎,现在apche官方网站已经更新至2.3.1的版本,而且热度居高不下.很多企业越来越多的倾向于使用spark进行海量数据处理,主要是源于其高效快速的架构设计. docker也是非常热门的虚拟化技术,而且发展趋势也是越来越强大,源于其超轻量级的部署和低资源消耗著称,对于大数据从业人群,两者组合

免费的中文深度学习全书:《深度学习理论与实战:提高篇》

在线阅读:深度学习理论与实战:提高篇 序言 16年9月的时候我在CSDN发了一些深度学习的文章,主要是面向没有太多经验的开发者.达文读了后觉得我的文章比较通俗易懂,邀请我写一本书,当时头脑一热就答应下来.虽然现在出版的书籍汗牛充栋,但是对我来说著书立言始终是一件非常严肃和重大的事情.立德.立功.立言乃儒家的三不朽,可见古人对于其重视.我的这本书只是关于深度学习的技术类书籍,远远谈不上立言,但是总归会有一些读者的,因此我希望这本书至少对读者有一些帮助,而不是误人子弟.从开始写下第一个字到现在,前后

网络设备-华三-防火墙F1020-IRF虚拟化实战终结配置篇

此篇h3c-IRF的实战配置,同样与前面华为的堆叠一样路子,我们先聊聊为啥要做这个?为什么不玩双机,要玩IRF.其实弄懂这一点,对于售前来讲,在外面做方案也是思路相当清晰的一点. 以前我们常规的双机方案如下图: 架构特点: 1.全网无单点故障,完整的解决因为单电源或者单一设备故障引起的业务不可用. 2.核心交换区-使用华为stack堆叠(前面有文章单独介绍) 3.防火墙HA(Juniper-NSRP协议,不懂度娘)(可能大家会问题,防火墙到华为交换机为什么没做lacp或者aggregate,大家

iOS开发——开发实战总结OC篇&amp;地图与定位(LBS)-CoreLocation篇

地图与定位(LBS)-CoreLocation篇 一:地图与定位基本框架(MapKit时基于CoreLocation实现的夜可以实现定位) 二:开发常用技术 LBS:基于位置的服务 SoLoMo:社交,本地,移动化 三:定位授权提示(iOS之前) 四:每个一段距离定位 五:后台服务:默认只能在前台服务 plist文件中 对应plist文件的值(数组) 六:基于基站定位 七:iOS8以上的服务 前台定位 定位服务开启 开启授权 后台服务(可以不勾选后台模式) 定位服务开 开启后台授权 授权改变 /

SpringBoot实战 之 异常处理篇

在互联网时代,我们所开发的应用大多是直面用户的,程序中的任何一点小疏忽都可能导致用户的流失,而程序出现异常往往又是不可避免的,那该如何减少程序异常对用户体验的影响呢?其实方法很简单,对异常进行捕获,然后给予相应的处理即可.但实现的方式却有好多种,例如: try { ... } catch (Exception e) { doSomeThing(); } 像这种标准的 try-catch 是可以解决问题,但如果让你在每个接口实现里面都 try-catch 一下,我想你应该是不太愿意的.那么下面来介