.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);
        }
时间: 2024-07-30 08:42:12

.NET Framework反射总结的相关文章

发送邮件的小功能(.net core 版)

前言: 使用.net core 开发有一段时间了,期间从.net core 2.0 preview1 到 preview2 又到core 1.1 现在2.0正式版出来了.又把项目升级至2.0了.目前正在用2.0进行开发.期间也遇到了不少问题.在这里进行总结一下. 最近工作内容就是job的迁移工作,从Framework迁移到.net Core上.体会到了两个框架的不同之处.以及使用过程中体会到的1.1和2.0的不同 以及Framework和Core的不同.首先说一下2.0和Framework的不同

《软件测试自动化之道》- 基于反射的UI自动化测试框架 - UI Automation Test Framework

测试自动化程序的任务 基于反射的ui测试自动化程序,要完成的6项任务: 通过某种方式从测试套件程序中运行待测程序(AUT: Applicaton Under Test),以便于两个程序之间进行通信 操纵应用程序的窗体,从而模拟用户对窗体所实施的moving和resizing操作 检查应用程序窗体,确定应用程序的状态是否准确 操纵应用程序控件的属性,从而模拟用户的一些操作,比如模拟在一个TextBox控件里输入字符 检查应用程序控件的属性,确定应用程序的状态是否准确 调用应用程序的方法,从而模拟一

.NET FRAMEWORK版本:4.0.30319; ASP.NET版本:4.6.118.0

https://gqqnbig.me/2015/11/23/net-framework%e7%89%88%e6%9c%ac4-0-30319-asp-net%e7%89%88%e6%9c%ac4-6-118-0/?utm_source=tuicool&utm_medium=referral .net framework 4.5是一个就地升级,直接升级了.net 4.0:而不是与.net 4.0并存.[1] .net framework 4.5由公共语言运行时(CLR)4.0.一些新的类和老的类的

转鹤冲天兄反射性能比较

替代反射调用的几种方式及性能测试 2013-03-31 17:25 by 鹤冲天, 6065 阅读, 21 评论, 收藏, 编辑 园子里和这个话题的相关文章比较多,本文是旧话重提,外加个小的总结.主要因为近期看到很多同事.朋友都已经使用 VS2012 进行 .NET 4.5 开发了,却还在大量使用反射,不知道用新的方式.或有所了解,但又害怕性能不好不敢大胆去用. 本文以如下类为例: public class MyMath { public int Add(int a, int b) { retu

Spring Framework 官方文档学习(四)之Validation、Data Binding、Type Conversion

前言 在Spring Framework官方文档中,这三者是放到一起讲的,但没有解释为什么放到一起.大概是默认了读者都是有相关经验的人,但事实并非如此,例如我.好在闷着头看了一遍,又查资料又敲代码,总算明白了. 其实说穿了一文不值,我们用一个例子来解释: 假定,现有一个app,功能是接收你输入的生日,然后显示你的年龄.看起来app只要用当前日期减去你输入的日期就是年龄,应该很简单对吧?可惜事实不是这样的. 这里面有三个问题: 问题一:我们输入的永远是字符串,字符串需要转成日期格式才能被我们的ap

ASP.NET Core官方计划路线及需要废除的一些Framework技术

概述 下面是 ASP.NET Core的时间表和路线图. 注意日期和特性都可能更改. 作为.NET Core这么大的一个项目,很难准确预测每一个计划的是否有变动. 即便如此,我们还是计划公开和透明的实施,以便我们的用户可以有正确的期望值, 并为我们的用户自己在技术实施时有更好的打算和安排 发布时间表 Release 发布日志 1.1 Q4 2016 / Q1 2017 1.2 Q1 2017 / Q2 2017 Release 版本特性 1.1 URL 重写中间件 Response 缓存中间件

编写高质量代码改善C#程序的157个建议——建议15: 使用dynamic来简化反射实现

建议15: 使用dynamic来简化反射实现 dynamic是Framework 4.0的新特性.dynamic的出现让C#具有了弱语言类型的特性.编译器在编译的时候不再对类型进行检查,编译器默认dynamic对象支持开发者想要的任何特性.比如,即使你对GetDynamicObject方法返回的对象一无所知,也可以像如下这样进行代码的调用,编译器不会报错: dynamic dynamicObject = GetDynamicObject(); Console.WriteLine(dynamicO

Entity Framework教程(第二版)

源起 很多年前刚毕业那阵写过一篇关于Entity Framework的文章,没发首页却得到100+的推荐.可能是当时Entity Framework刚刚发布介绍EF的文章比较少.一晃这么多年过去了,EF6.1已经发布很久,EF7马上就到来.那篇文章已经显得相当过时,这期间园子里出现了很多介绍EF4/5/6版本的精彩文章,我的工作中也没有在持续使用EF,本来也就不准备再写现在这篇文章了.后来看到之前那篇文章还是有很多朋友在评论里给予鼓励,再加上自己确实在使用新版EF的过程中也总结了一些心得,解决了

C#基础--Attribute(标签) 和 reflect(反射) 应用

1.Attribute的定义与作用: 公共语言运行时允许你添加类似关键字的描述声明,叫做attributes, 它对程序中的元素进行标注,如类型.字段.方法和属性等.Attributes和Microsoft .NET Framework文件的元数据保存在一起,可以用来向运行时描述你的代码,或者在程序运行的时候影响应用程序的行为.比如在WCF中常用的序列化.比如添加的[DataMenber]就是一种标签.以及xml序列化也是一样的. 2.Reflect的定义与作用 反射可以用于观察并修改程序在运行