.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入门与实战(实战调参篇) 前言 前面几篇博文都在学习原理知识,是时候上 ...
随机推荐
- Linux 攻击防护基础排查
作者:Zzang 来源:cnblogs 原文:https://www.cnblogs.com/Zzang/p/LinuxHack.html 版权声明:本文为博主原创文章,转载请附上博文链接! 基本网络 ...
- 选择器的使用(nth-child和nth-last-child选择器)
<!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head><meta ...
- 链表倒置,这个还是考验仔细程度,第一遍还没做对 —— 剑指Offer
https://www.nowcoder.net/practice/75e878df47f24fdc9dc3e400ec6058ca?tpId=13&tqId=11168&tPage= ...
- 深度学习-theano-windows -cuda-环境搭建
本文将具体介绍深度学习之cuda的环境搭建 工具:支持CUDA的显卡(安装cuda6.5),VS2013.Anaconda. 步骤: 1.安装cuda6.5 这个不具体介绍,网上有很多文章.注意选择你 ...
- python 时区
Python中的时区处理 http://tech.glowing.com/cn/dealing-with-timezone-in-python/ Python时区设置方法与pytz查询时区教程_py ...
- NTFS文件系统的单个文件最大到底有多大?
于NTFS文件系统的单个文件最大到底有多大? 闲来无事突然想到这个问题,到网上搜索了一下也没有一个固定的解释. 于是到微软官方知识库去寻找答案: 注意:基础硬件限制可能会对任何文件系统施加额外的分区大 ...
- Python Tricks(十九)—— switch 的实现
python 原生语法不支持 switch,体现了 Python 大道至简的设计思路,有时为了避免啰嗦的 if elif等判断语句,我们可以用字典来代替 switch 的各分支,也即建立表达式和操作的 ...
- BZOJ_1493_[NOI2007]项链工厂_Splay
BZOJ_1493_[NOI2007]项链工厂_Splay Description T公司是一家专门生产彩色珠子项链的公司,其生产的项链设计新颖.款式多样.价格适中,广受青年人的喜爱. 最近T公司打算 ...
- [Codeforces 1037E] Trip
[题目链接] http://codeforces.com/problemset/problem/1037/E [算法] 首先离线 , 将问题倒过来考虑 , 转化为 : 每次删除一条边 , 此时最多有多 ...
- Flask中的ThreadLocal本地线程,上下文管理
先说一下和flask没有关系的: 我们都知道线程是由进程创建出来的,CPU实际执行的也是线程,那么线程其实是没有自己独有的内存空间的,所有的线程共享进程的资源和空间,共享就会有冲突,对于多线程对同一块 ...