C#高级编程之反射
反射的定义
MSDN定义:反射提供描述程序集、模块和类型的对象(Type类型)。 可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型,然后调用其方法或访问器字段和属性。 如果代码中使用了特性,可以利用反射来访问它们。
一共三句话。
第一句意思是可以利用反射提供的API来获取程序集信息,包括其下的模块、Type类型信息;
第二句意思通过反射,先拿到这个程序集->Module->Type的类型信息,然后调用实例化的API Activator.CreateInstance(type type)来实例化该类型对象,拿到对象instance后,可以对这个对象数据成员进行赋值,然后注入到现有对象B中;或者是利用API获取这个类型下的属性、方法等信息,对其进行读写、调用操作。
第三句意思是:如果反射获取到的这个类型有使用Attribute特性,可以进行互操作。
反射使用
反射一般使用过程如下:
装载程序集Assmebly
上面的方法讲的是反射AppDomain的所有程序集,我们可以显示的调用其中的一个程序集,system.reflecton.assembly 类型提供了下面三种方法:
1、Load 方法:极力推荐的一种方法,Load 方法带有一个程序集标志并载入它,Load 将引起CLR把策略应用到程序集上,先后在全局程序集缓冲区,应用程序基目录和私有路径下面查找该程序集,如果找不到该程序集系统抛出异常
2、LoadFrom 方法:传递一个程序集文件的路径名(包括扩展名),CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,和公钥信息,如果在指定路径找不到程序集抛出异常。
3、LoadWithPartialName:永远不要使用这个方法,因为应用程序不能确定再在载入的程序集的版本。该方法的唯一用途是帮助那些在.Net框架的测试环节使用.net 框架提供的某种行为的客户,这个方法将最终被抛弃不用。
注意:system.AppDomain 也提供了一种Load 方法,他和Assembly的静态Load 方法不一样,AppDomain的load 方法是一种实例方法,返回的是一个对程序集的引用,Assembly的静态Load 方发将程序集按值封装发回给发出调用的AppDomain.尽量避免使用AppDomain的load 方法。
获取类型信息
//定义一个获取反射内容的方法
static void getreflectioninfo(Assembly myassembly)
{
Type[] typearr = myassembly.GetTypes();//获取类型
foreach (Type type in typearr)//针对每个类型获取详细信息
{
//获取类型的结构信息
ConstructorInfo[] myconstructors = type.GetConstructors(); //获取类型的字段信息
FieldInfo[] myfields = type.GetFields(); //获取方法信息
MethodInfo[] myMethodInfo = type.GetMethods(); //获取属性信息
PropertyInfo[] myproperties = type.GetProperties(); //获取事件信息
EventInfo[] Myevents = type.GetEvents();
}
}
调用普通类泛型方法
泛型方法签名:public void Show<T,W,X>(T t,W,w,X x);
Assembly assmebly=Assembly.Load("")
Type type=assembly.GetType("namespace.sqlServerHelper");
dbHeperInstace =Activator.CreateInstace(type)
MethodInfo genericMethod=type.GetMethod("show");
MethodInfo genericMethod1=genericMethod.MakeGenericMethod(new Type[]{typeof(int),typeof(string),typeof(DateTime)};
genericMethod1.invoke(dbHeperInstace,new object[]{123,"john",DateTime.Now};
调用泛型类里面泛型方法
【[此处的Show方法的具体参数的type类型依赖于class上的<T,W,X>]】eg.
class GenericClass<T,W,X>
{
public void Show<T,W,X>(T t,W,w,X x)
}
[占位符]
Type type=assembly.GetType("namespace.sqlServerHelper.GenericClass`3");
Type type1=type.MakeGenericType(new Type[]{typeof(int),typeof(string),typeof(DateTime)};
object GenericdbHeperInstace =Activator.CreateInstace(type1);
MethodInfo genericMethod=type1.GetMethod("show");
genericMethod.invoke(GenericdbHeperInstace,new object[]{123,"john",DateTime.Now});
反射设置属性值
对于属性的操作具体可以参考 https://blog.csdn.net/shuzhongke123/article/details/106091047
总结
反射特点:
动态 减少对象与对象之间的依赖,只需要知道类名,方法名就可以调用,还可以突破特定权限,可以做到普通方式无法做到的。
性能问题:经过缓存优化之后,是普通的10倍。对于性能损耗,请理性看待。
参考:https://www.cnblogs.com/wangshenhe/p/3256657.html
C#高级编程之反射的更多相关文章
- Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结
Atitit. 高级软件工程师and 普通的区别 高级编程的门槛总结 1. 完备的知识体系 2 2. 编程理论/原理的掌握 2 1.1. 掌握常用的概念(ORM,IOC,AOP,event driv ...
- C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 38 章 实体框架核心(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# 6 ...
- C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(上)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(上)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...
- C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)
译文,个人原创,转载请注明出处(C# 6 与 .NET Core 1.0 高级编程 - 41 ASP.NET MVC(中)),不对的地方欢迎指出与交流. 章节出自<Professional C# ...
- C#高级编程笔记之第三章:对象和类型
类和结构的区别 类成员 匿名类型 结构 弱引用 部分类 Object类,其他类都从该类派生而来 扩展方法 3.2 类和结构 类与结构的区别是它们在内存中的存储方式.访问方式(类似存储在堆上的引用类型, ...
- 解读经典《C#高级编程》第七版 Page79-93.对象和类型.Chapter3
前言 本篇我们继续讲解本章其余的部分:构造函数.只读字段.匿名类型.结构详解.部分类.静态类.Object类.扩展方法,等. 01 类 构造函数 构造函数是一种特殊的方法: 与类同名 没有返回值,甚至 ...
- 解读经典《C#高级编程》第七版 Page68-79.对象和类型.Chapter3
前言 新年好,本篇开始进入第三章,<对象和类型>,深刻理解C#的对象,对于使用好.Net类库非常重要. 01 类和结构 从使用角度看,结构和类的区别很小,比如,将结构定义转换为类,只需要将 ...
- 解读经典《C#高级编程》第七版 Page45-50.核心C#.Chapter2
前言 本篇讲述枚举和名称空间. 01 枚举 首先需要明确枚举的概念:枚举是用户定义的整数类型.使用枚举的目标是,使用一组容易记忆的名称,来使得代码更容易编写和维护. 我们对比枚举的定义和类的定义,会发 ...
- 解读经典-《C#高级编程》第七版-Chapter1-.Net体系结构-Page13-20
01 程序集 程序集是包含编译好的.基于.Net Framework的代码逻辑单元.一般来说,在Visual Studio中的一个项目即一个程序集,而一个项目中包含多种不同的代码文件.程序集分为可执行 ...
随机推荐
- centos8上使用crond
一,查看crond的状态: [root@yjweb crontab]# systemctl status crond 说明:和其他service的执行相同: 启动:systemctl start cr ...
- TimeSpan时间间隔详解
1 public string GetShiXian(string fadanshijian) 2 { 3 string result,chulishijian; 4 5 DateTime fdTim ...
- 忘记MySQL密码怎么办?一招教你搞定!
在安装完 MySQL 或者是在使用 MySQL 时,最尴尬的就是忘记密码了,墨菲定律也告诉我们,如果一件事有可能出错,那么它一定会出错.那如果我们不小心忘记了 MySQL 的密码,该如何处理呢?别着急 ...
- Hadoop框架:DataNode工作机制详解
本文源码:GitHub·点这里 || GitEE·点这里 一.工作机制 1.基础描述 DataNode上数据块以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是数据块元数据包括长度.校验.时 ...
- 安装Linux注意事项
网络配置NAT Worstation 生成虚拟网卡,编辑虚拟网络中子网IP地址为10网段内部地址,避免冲突. Linux命令 查看主机IP地址 [root@C8 ~]# hostname -I 19 ...
- 记录Spring Boot 2.3.4.RELEASE版注解方式实现AOP和通知的执行顺序
1.advice 按照以下的顺序执行 输出结果:(正常和异常) 说明:Spring boot 2.3.4.RELEASE 版本使用的AOP是spring-aop-5.2.9.RELEASE,AOP的通 ...
- IL角度理解C#中字段,属性与方法的区别
IL角度理解C#中字段,属性与方法的区别 1.字段,属性与方法的区别 字段的本质是变量,直接在类或者结构体中声明.类或者结构体中会有实例字段,静态字段等(静态字段可实现内存共享功能,比如数学上的pi就 ...
- 记2020年初对SimpleGUI源码的阅读成果
2020春节,阅读了下SimpleGUI源码,我一直喜欢边阅读,边手绘图片,所以这里只贴几张图片. 一,什么是SimpleGUI ? https://gitee.com/Polarix/simpleg ...
- oracle oracle sqldeveloper 12505 创建连接失败
ref:http://blog.csdn.net/yangwenxue_admin/article/details/45062557
- 记一次py交易
讲一个故事 以下故事真实性不保证(你们懂的) 我没说这个是真的 所以不能当做以后别人挑我刺的证据 我只是讲个故事罢了 故事可以是fake 我不会承认这个故事是真的罢了 朋友是某c9高校工科专业 学校培 ...