.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, );//设置字段_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实战之反射操作篇的更多相关文章
- spring boot实战(第十三篇)自动配置原理分析
前言 spring Boot中引入了自动配置,让开发者利用起来更加的简便.快捷,本篇讲利用RabbitMQ的自动配置为例讲分析下Spring Boot中的自动配置原理. 在上一篇末尾讲述了Spring ...
- Sping Boot入门到实战之入门篇(三):Spring Boot属性配置
该篇为Sping Boot入门到实战系列入门篇的第三篇.介绍Spring Boot的属性配置. 传统的Spring Web应用自定义属性一般是通过添加一个demo.properties配置文件(文 ...
- Sping Boot入门到实战之入门篇(二):第一个Spring Boot应用
该篇为Spring Boot入门到实战系列入门篇的第二篇.介绍创建Spring Boot应用的几种方法. Spring Boot应用可以通过如下三种方法创建: 通过 https://start.spr ...
- Sping Boot入门到实战之入门篇(一):Spring Boot简介
该篇为Spring Boot入门到实战系列入门篇的第一篇.对Spring Boot做一个大致的介绍. 传统的基于Spring的Java Web应用,需要配置web.xml, applicationCo ...
- Sping Boot入门到实战之入门篇(四):Spring Boot自动化配置
该篇为Sping Boot入门到实战系列入门篇的第四篇.介绍Spring Boot自动化配置的基本原理与实现. Spring Boot之所以受开发者欢迎, 其中最重要的一个因素就是其自动化配置特性 ...
- R实战 第三篇:数据处理(基础)
数据结构用于存储数据,不同的数据结构对应不同的操作方法,对应不同的分析目的,应选择合适的数据结构.在处理数据时,为了便于检查数据对象,可以通过函数attributes(x)来查看数据对象的属性,str ...
- Docker虚拟化实战学习——基础篇(转)
Docker虚拟化实战学习——基础篇 2018年05月26日 02:17:24 北纬34度停留 阅读数:773更多 个人分类: Docker Docker虚拟化实战和企业案例演练 深入剖析虚拟化技 ...
- xgboost入门与实战(原理篇)
sklearn实战-乳腺癌细胞数据挖掘 https://study.163.com/course/introduction.htm?courseId=1005269003&utm_campai ...
- xgboost入门与实战(实战调参篇)
https://blog.csdn.net/sb19931201/article/details/52577592 xgboost入门与实战(实战调参篇) 前言 前面几篇博文都在学习原理知识,是时候上 ...
随机推荐
- iis站点内存泄漏问题分析
在一次上线过程中iis内存飙升,随后跟运维要到站点的dump文件,使用windbg分析了clr的内存分配,找到了问题的症结,先记录如下: 使用windbg加载dump文件 1.打开windbg,Fil ...
- http://www.cnblogs.com/sprinkle/
http://www.cnblogs.com/sprinkle/ http://www.cnblogs.com/sprinkle/
- Windows下如何查看当前登录用户
1.通过whoami命令查看 2.通过username变量查看,具体命令如下:echo %username% 上述两种方法只能查看当前会话用户信息,那么如何看到其他登录用户呢? 可以通过执行query ...
- CentOS 5.11开启VNC Service
1. #yum install vncserver 2. #vncpasswd 此密码将成为vnc的login password password: ...
- KLT 光流
一 光流 光流的概念是Gibson在1950年首先提出来的.它是空间运动物体在观察成像平面上的像素运动的瞬时速度,是利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧跟当前帧之间存在 ...
- Cocos2D-X2.2.3学习笔记12(瞬时动作)
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaHVjYmxvZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- VMware14秘钥
VMware虚拟机已升级至14版本,之前的12版本的秘钥已经无法使用,在此分享一下VMware Workstation 14永久激活密钥: CG54H-D8D0H-H8DHY-C6X7X-N2KG6 ...
- ios19---xib
// // ViewController.m #import "ViewController.h" @interface ViewController () @end @imple ...
- YTU 2530: 小勇玩lol
2530: 小勇玩lol 时间限制: 1 Sec 内存限制: 128 MB 提交: 112 解决: 77 题目描述 小勇是一个忠实的lol玩家,他有自己的战斗力计算方法,每个星期他都会算一下自己的 ...
- HDU 5073 数学题
题目传送门 http://acm.hdu.edu.cn/showproblem.php?pid=5073 这道题RE了好多发啊囧,RE到精神不振. Galaxy的质心并不是一成不变的,随着一些星球的移 ...