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, );//设置字段_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 = ,
[Description("审核通过")]
PASS = ,
[Description("审核不通过")]
NOT_PASS =
}

非反射的做法一般如下:

        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(','),);
}

 --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生成强类型的表单,其实也和反射有关

总结: 

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

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

  1. spring boot实战(第十三篇)自动配置原理分析

    前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...

  2. Sping Boot入门到实战之入门篇(三):Spring Boot属性配置

    该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置.   传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...

  3. Sping Boot入门到实战之入门篇(二):第一个Spring Boot应用

    该篇为Spring Boot入门到实战系列入门篇的第二篇.介绍创建Spring Boot应用的几种方法. Spring Boot应用可以通过如下三种方法创建: 通过 https://start.spr ...

  4. Sping Boot入门到实战之入门篇(一):Spring Boot简介

    该篇为Spring Boot入门到实战系列入门篇的第一篇.对Spring Boot做一个大致的介绍. 传统的基于Spring的Java Web应用,需要配置web.xml, applicationCo ...

  5. Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置

    该篇为Sping Boot入门到实战系列入门篇的第四篇.介绍Spring Boot自动化配置的基本原理与实现.   Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性 ...

  6. R实战 第三篇:数据处理(基础)

    数据结构用于存储数据,不同的数据结构对应不同的操作方法,对应不同的分析目的,应选择合适的数据结构.在处理数据时,为了便于检查数据对象,可以通过函数attributes(x)来查看数据对象的属性,str ...

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

    Docker虚拟化实战学习——基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker   Docker虚拟化实战和企业案例演练 深入剖析虚拟化技 ...

  8. xgboost入门与实战(原理篇)

    sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...

  9. xgboost入门与实战(实战调参篇)

    https://blog.csdn.net/sb19931201/article/details/52577592 xgboost入门与实战(实战调参篇) 前言 前面几篇博文都在学习原理知识,是时候上 ...

随机推荐

  1. wget: unable to resolve host address “mirrors.163.com” 的解决办法

    wget:无法解析主机地址.这就能看出是DNS解析的问题. 解决办法: 登入root(VPS). 进入/etc/resolv.conf. 修改内容为下nameserver 8.8.8.8 #googl ...

  2. Java ThreadLocal 使用详解

    ThreadLocal的官方API解释为: "该类提供了线程局部 (thread-local) 变量.这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每 ...

  3. Tcl学习之--文件操作

    Tcl中文件名称操作遵循Unix/Linux的命名规范. x/y/z表示x文件夹下的y 子文件夹及y以下的子文件夹z. ~admin/email则表示admin用户的email目录. l  file ...

  4. HDMI接口基础知识及硬件设计

    参考资料:http://blog.csdn.net/u013625961/article/details/53434189: http://blog.csdn.net/u014276460/artic ...

  5. Linux地址ping不通情况怎么办?

    查看原文:http://www.ibloger.net/article/325.html Linux地址ping不通情况怎么办? 问题:今天写了一个微信支付的项目.有一个class中使用了httpPo ...

  6. (五)Java 对象和类

    Java 对象和类 Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 消息解析 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例,有状态和行为. ...

  7. win下IE设置

    当win7系统时需要升级IE为11版本,需要先安装sp1版本补丁,再装IE11,若还是装不了,可借助第三方平台(电脑管家等)升级安装.或 更新系统再安装IE11 https://jingyan.bai ...

  8. presentModalViewController和dismissModalViewControllerAnimated的使用总结

    在实际开发中,如果要弹出视图: 我们常用到presentModalViewController方法和dismissModalViewControllerAnimated方法. presentModal ...

  9. js验证手机号,身份证,车牌号验证

    js验证手机号  <input type="text" class="identificationno"> // 身份证号码为15位或者18位,15 ...

  10. python-----tuple用法

    有一种有序列表叫元组:tuple.tuple和list非常类似,但是tuple一旦初始化就不能修改,比如同样是列出同学的名字: >>> classmates = ('Michael' ...