.NET Framework反射总结
概述
程序集的反射以及动态的创建类对象,是自动化编程常用的到知识原理,比如插件编程、模板设计模式,都可以采用发射机制动态的去创建实例化对象,实现类的动态加载。这里简单总结下,常用到的Framework反射知识点(泛型和非泛型);.NET框架的三个内置类来使用反射:System.Reflection.Assembly、System.Type和System.Activator;
- System.Reflection.Assembly类描述了.NET的程序集.在.NET中,程序集是配置单元.对于一个典型的Windows程序,程序集被配置为单一的Win32可执行文件,并且带有特定的附加信息,使之适应.NET运行环境.程序集也可以配置为Win32的DLL(动态链接库),同样需要带有.NET需要的附加信息。System.Reflection.Assembly类可以在运行的时候取得程序集的信息.这些信息包括程序集包含的类型信息。
- System.Type类描述了类型定义.一个类型声明可以是一个类,接口,数组,结构体,或者枚举.在加载了一个类之后,System.Type类可以被用于枚举该类支持的方法,属性,事件和接口。
- System.Activator类用于创建一个类的实例。
程序集Assembly
程序集的加载和读取方式
Assembly[] AssbyCustmList = System.AppDomain.CurrentDomain.GetAssemblies();//获取当前那所有程序集 Assembly ResltAss = typeof(IServicePlugin).Assembly;//当前类型所在程序集 Assembly tmp = Assembly.LoadFile(filepath);//文件路径加载
程序集Type类型
获取程序集Type类型
Assembly tmp = Assembly.LoadFile(file);//文件路径加载
Type[] types = tmp.GetTypes();//获取程序集的所有类型
Type[] Items= tmp.GetExportedTypes();//获取程序集公用类型
判断程序集的属性信息:接口实现、泛型类型
Type t=GetType();
Type[] interfaces = t.GetInterfaces();//获取该类型上层实现所有接口
foreach( Type theInterface in interfaces )
{
if (theInterface.FullName == "WinDemo.Core.Iplugin")
{
ret = true;
break;
}
}
//t.GetTypes().Where(x => x.GetInterfaces().Count(p => p.FullName == "PluginUnitTestProject.IServicePlugin") >0)//(简写,功能同上)
Type[] interfaces = t.GetInterface("Iplugin");//获取该类型上层实现接口Iplugin类型
判断泛型方式:IsGenericType、GetGenericTypeDefinition()和GetGenericArguments()
private IEnumerable<Type> GetHandlerTypes<T>() where T : Command
{
var handlers = typeof(ICommandHandler<>).Assembly.GetExportedTypes()
.Where(x => x.GetInterfaces()
.Any(a => a.IsGenericType && a.GetGenericTypeDefinition() == typeof(ICommandHandler<>) ))
.Where(h=>h.GetInterfaces()
.Any(ii=>ii.GetGenericArguments()
.Any(aa=>aa==typeof(T)))).ToList(); return handlers;
}
程序的创建
通过程序集的CreateInstance
Assembly tmp = Assembly.LoadFile(filepth);//文件路径加载
Type[] types = tmp.GetTypes();
bool ok = false;
foreach (Type t in types)
{
if (IsValidPlugin(t))
{
IServicePlugin plugin = (IServicePlugin)tmp.CreateInstance(t.FullName);
//动态加载程序集里面方法,动态调用
MethodInfo medo = t.GetMethod("InvokeTask");medo.Invoke(serple, null);
}
}
通过Activator.CreateInstance
ServicePluginAttribute srevic = null;
foreach (Type itm in TypeItemList)
{
srevic = new ServicePluginAttribute();
var serple = Activator.CreateInstance(itm);
//动态调用程序集里面的方法
MethodInfo medo = t.GetMethod("InvokeTask");medo.Invoke(serple, null);
}
.NET Framework反射总结的更多相关文章
- 发送邮件的小功能(.net core 版)
前言: 使用.net core 开发有一段时间了,期间从.net core 2.0 preview1 到 preview2 又到core 1.1 现在2.0正式版出来了.又把项目升级至2.0了.目前正 ...
- windows类书的学习心得
原文网址:http://www.blogjava.net/sound/archive/2008/08/21/40499.html 现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千 ...
- .NET Core/Framework 创建委托以大幅度提高反射调用的性能
都知道反射伤性能,但不得不反射的时候又怎么办呢?当真的被问题逼迫的时候还是能找到解决办法的. 为反射得到的方法创建一个委托,此后调用此委托将能够提高近乎直接调用方法本身的性能.(当然 Emit 也能够 ...
- .NET基础篇——利用泛型与反射更新实体(ADO.NET Entity Framework)(转)
自从ADO.NET Entity Framework面世以来,受到大家的热捧,它封装了大量代码生成的工具,用户只需要建立好实体之间的关系,系统就是会为用户自动成功了Add.Delete.CreateO ...
- 软件测试自动化之- 基于反射的UI自动化测试框架 - UI Automation Test Framework
测试自动化程序的任务 基于反射的ui测试自动化程序,要完成的6项任务: 通过某种方式从测试套件程序中运行待测程序(AUT: Applicaton Under Test),以便于两个程序之间进行通信 操 ...
- Entity Framework教程(第二版)
源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,E ...
- 基于 SailingEase WinForm Framework 开发客户端程序(3:实现菜单/工具栏按钮的解耦及状态控制)
本系列文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- 基于 SailingEase WinForm Framework 开发优秀的客户端应用程序(1:概述)
本系统文章将详细阐述客户端应用程序的设计理念,实现方法. 本系列文章以 SailingEase WinForm Framework 为基础进行设计并实现,但其中的设计理念及方法,亦适用于任何类型的客 ...
- C++的性能C#的产能?! - .Net Native 系列五:.Net Native与反射
此系列系小九的学堂原创翻译,翻译自微软官方开发向导,一共分为六个主题.本文是第五个主题:.Net Native与反射. 向导文链接:<C++的性能C#的产能?! - .Net Native 系列 ...
随机推荐
- boost.lexical_cast 学习
1,字符串 到 数值类型的转换 2,数值 到 字符串的转换 3,异常处理情况 4,boost::lexical_cast 的原型: template<typename Target, typen ...
- python用WMI模块获取系统命名空间
可以和winmgmts的查询页面对应 from win32com.client import GetObject import pywintypes result=[] def enum_namesp ...
- Oracle服务器定位CPU使用率高的瓶颈(SQL)
1.首先用TOP命令监控系统资源,如果是AIX系统,就用topas,进入TOP命令的滚动刷新数据时,发现userCPU高达98%!! 保持top的状态下,按shift+p,可以将所有进程按CPU使用率 ...
- CF 545C
题意: 砍树, 树会向左或者向右倒,数不能倒重叠, 问最多可以砍多少树 思路: 贪心 + Dp吧, 树要尽可能网左倒,这样对后面的树影响较小, 才是最优状态 #include<iostream& ...
- Vue - Router 路由
路由的注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- mac系统 安装 JDK 并配置环境
第一步 : 下载 mac 版的 JDK 下载地址: http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-213 ...
- Ubuntu16.04安装Maven3.5.4
本篇教程在示例步骤中使用了以下版本的软件.操作时,请您以实际软件版本为准. 操作系统:Ubuntu 16.04.3 LTS Maven 版本:Apache Maven 3.5.4 JDK 版本:J ...
- Connection reset by [server_ip] port 22 (hexo d 部署博客出错)
问题 在使用 hexo d 部署博客和使用 Git/Github 进行 git push -u origin master 时遇到了以下问题: git -c diff.mnemonicprefix=f ...
- Confluence 6 配置一个 Confluence 环境
本部分对你 Confluence 的外部设置进行描述.包括有如何配置 Web 服务器,应用服务器,目录和文件等信息—— Confluence 运行所需要的所有环境.有关在服务器内部对配置进行修改的内容 ...
- Confluence 6 在你用户宏中使用参数
你可以为你的用户宏指定参数.这样的话,用户可以使用参数来决定 Confluence 页面的显示情况. 如何在 Confluence 页面中使用你的宏参数 当添加一个宏到 Confluence 页面中的 ...