.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入门与实战(实战调参篇) 前言 前面几篇博文都在学习原理知识,是时候上 ...
随机推荐
- REST API 安全设计
REST API 安全设计 2017年04月27日 18:34:27 阅读数:1699 Rest API 的那些事儿 作者/ asterisk 在软件行业快速发展的今天,传统的软件授权已经不能足以 ...
- clamav完整查杀linux病毒实战(摘抄)
http://dadloveu.blog.51cto.com/blog/715500/1882521 Linux服务器一直给我们的印象是安全.稳定.可靠,性能卓越.由于一来Linux本身的安全机制,L ...
- Application特征
1.位置:服务器内存,执行速度快2.使用范围:整个应用程序3.类型:任意类型4.声明周期:应用程序开始创建到销毁
- C# .NET 如何批量增加或取消注释
选中一批文本之后 批量增加注释:Ctrl+K Ctrl+C 批量取消注释:Ctrl+K Ctrl+U
- 【bzoj3288】Mato矩阵
题目大意:给定一个n阶行列式,第i行第j列为GCD(i,j),求这个行列式的值 高斯消元之后发现对角线上的东西是phi 于是线性筛出所有的欧拉函数即可 #include<algorithm> ...
- 什么是sibling and tail recursive calls
1 tail call 在函数f中调用函数b,如果这个调用是函数f中执行的最后一条指令,那么这个调用就称为tail call. 例子: int foo(float a, float b) { ... ...
- 函数计算 触发式计算 日志 MP3 图片 合成视频
函数计算 触发式计算 日志 MP3 图片 合成视频 [start_time]:20120511 06:59:11 [20120511 06:59:11_0.4950568322522534]: ...
- mongodb配置主从模式
Mongodb的replication主要有两种:主从和副本集(replica set).主从的原理和mysql类似,主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己 ...
- 危险的kill
. ps -aux | grep -E "chk.*url.*py" | cut -c 10-15 | xargs kill -9 ps -x | grep -E "ch ...
- 8-13 canvas专题-阶段练习二(下)
8-13 canvas专题-阶段练习二(下) <!DOCTYPE html> <html lang="zh-cn"> <head> <me ...