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. 创建简单的spring-mvc项目

    1.第一步:创建项目 new—>Dynamic Web Project 项目创建成功后,展示如图: 2.第二步:导入springmvc的jar包和common-logging.jar 3.第三步 ...

  2. 【SQL Server 学习系列】-- 收缩数据库文件大小

    USE WebExam; GO ALTER DATABASE WebExam SET RECOVERY SIMPLE; GO -- 收缩文件到 1 MB. ); GO ALTER DATABASE W ...

  3. rsyslog trouble shooting

    openstack,swift的log不输出了.trouble shooting过程 , 发现我们的程序 /var/log/swift/proxy.log等总是不输出log. 因为log rsyslo ...

  4. golang time.Duration()的问题解疑

    原文:  How to multiply duration by integer? 看到golang项目中的一段代码, ---------------------------------------- ...

  5. go语言中的timer 和ticker定时任务

    https://mmcgrana.github.io/2012/09/go-by-example-timers-and-tickers.html --------------------------- ...

  6. ServiceStack学习之一准备工作

    GitHub:https://github.com/ServiceStack/ServiceStack/wiki 官网介绍的前期准备知识: Wikipedia article about HTTP a ...

  7. Android源代码文件夹结构说明

    在学习Android的过程中,学习写应用还好.一開始不用管太多代码.直接调用函数就能够了,可是工作中却须要改动到framework之类的东东 所以感觉開始纠结了,又是初学,非常多不懂,所以就去找了关于 ...

  8. Android 修改开机动画(bootanimation)【转】

    本文转载自:http://blog.csdn.net/u012301841/article/details/51598115 Android 系统自带的开机动画,是一个白色的 “android” 文字 ...

  9. POJ2686 Traveling by Stagecoach 状态压缩DP

    POJ2686 比较简单的 状态压缩DP 注意DP方程转移时,新的状态必然数值上小于当前状态,故最外层循环为状态从大到小即可. #include <cstdio> #include < ...

  10. 基于Flink的视频直播案例(上)

    目录 数据产生 Logstash部分 Kafka部分 Flink部分 配置/准备代码 视频核心指标监控 本案例参考自阿里云的视频直播解决方案之视频核心指标监控和视频直播解决方案之直播数字化运营. 基于 ...