30天C#基础巩固----程序集,反射
一:认识程序集
只要是使用VS就会和程序集打交道,我们通过编辑和生产可执行程序就会自动生成程序集。那么什么事程序集呢,.net中的dll与exe文件的都是程序集(Assembly)。
可以看做是一堆相关类打包的包,相当于java中的jar包(*);
程序集包含:类型元数据,程序集元数据,IL代码,资源文件
类型元数据:描述在代码中定义的每一类型和成员的二进制形式。
程序集元数据:程序集清单,版本号,名称等;
IL代码:被微软封装到了exe和IL中。
资源文件:每个程序集都有自己的名称,版本等信息,都可以通过AssemblyInfo.cs文件来自己定义。
好处:程序中只引用必须的程序集,减小程序的尺寸。可以封装一个代码,只提供必要的访问接口。
二:反射学习
反射看似很高深,听起来不太的容易理解,但是我们要是经常的使用它,那就会变得很简单。
vs的智能提示就是通过反射来获取到类的属性,方法等,还有反编译工具也是。
定义:反射就是动态的获取程序集中的元数据来操作类型的。反射就是直接通过调用.dll来创建对象,调用成员的。通过类型元数据来获取对象的一些相关信息,并且还可以实例化对象调用方法等,这个就是反射。
Type类是实现反射的重要类,通过它可以获取到类中的所有信息包括方法,属性等,可以动态的调用类,方法,Type是对类的描述,反射让创建对象的方式发生了变化。
- Assembly里面存储的是我们调用程序集的一些东西,我们通过这个类来进行调用程序集。
- 通过 Activator.CreateInstance()来使用反射创建实例化对象。返回的是object类型。
- 通过 minfo.Invoke(object,null)来调用类库中的方法。第一个是对象类型,第二个是我们调用方法的参数列表。
eg1:
读取Clb.dll文件,读取里面所有的类(Type)。
Clb.dll文件
namespace Clb
{
public class Class1
{
//属性
private int Age { get; set; }
//方法
public void SayHi()
{
Console.WriteLine("你好世界 ?");
}
//接口
public interface IFlyable
{
void Fly();
}
//委托
public delegate void MyDelegate();
}
}
main()方法
static void Main(string[] args)
{
//通过Assembly来取到本地的程序集。
Assembly asm = Assembly.LoadFile("C:/Clb.dll"); //注意它的返回值
Type[] type=asm.GetTypes(); //得到所有的类型,注意返回值。
foreach (Type item in type)
{
Console.WriteLine(item.Name);
}
Console.Read();
}

获取只有public类型的
//只获取public类型
Type[] type = asm.GetExportedTypes();
出现错误如下,解决办法是我们的设置有问题,在调试--选项和设置---常规(下图),这样就可以读取到本地的dll文件了。


eg:加载Class1中的所有方法。
//加载程序集
Assembly asm = Assembly.LoadFile("C:/Clb.dll");
//获取Class1下这个类型,typeclass描述Class1类的type,里面存储的是class1的一些相关信息,。
Type typeclass= asm.GetType("Clb.Class1");
//获取class1中的所有方法 ,注意返回值。
MethodInfo[] minfo= typeclass.GetMethods();
foreach (MethodInfo item in minfo)
{
Console.WriteLine(item.Name);
}
Console.Read();
下面图片里面的方法我们的类中没有,那是我们object基类的一些公共方法。

eg:
通过反射来创建对象,调用类库中的方法。
//1:加载程序集
Assembly asm = Assembly.LoadFile("C:/Clb.dll");
//2:获取Class1下这个类型,typeclass描述Class1类的type,里面存储的是class1的一些相关信息,。
Type typeclass= asm.GetType("Clb.Class1");
//3:获取class1中的所有方法 ,注意返回值。
MethodInfo minfo = typeclass.GetMethod("SayHi");
Console.WriteLine(minfo.Name);
//创建一个Class1类型对象
object obj = Activator.CreateInstance(typeclass);
//通过反射来调用方法
minfo.Invoke(obj, null);
Console.Read();

三:Type类的使用
通过类获取Type;通过对象获取类的Type,通过Assembly类获取Type。

Person p=new Person();
//通过基类的GetType类获取Type
Type t= p.GetType();
//通过typeof来获取。
Type ts = typeof (Person);
//通过程序集来获取;
Assembly asm = Assembly.LoadFile("C:/Clb.dll");
Type tss = asm.GetType("Clb.dll.Person");
30天C#基础巩固----程序集,反射的更多相关文章
- IOC容器特性注入第一篇:程序集反射查找
学习kooboo的框架发现它的注入容器方法比较特别,同样是利用MVC的注入点,但它是查找网站下面bin所有的DLL利用反射查找特性找到对应的服务注入到容器. 这样的好处很简单:完全可以不用关心IOC容 ...
- C#基础知识回顾-- 反射(3)
C#基础知识回顾-- 反射(3) 获取Type对象的构造函数: 前一篇因为篇幅问题因为篇幅太短被移除首页,反射这一块还有一篇“怎样在程序集中使用反射”, 其他没有什么可以写的了,前两篇主要是铺垫, ...
- C#基础知识回顾-- 反射(1)
C#基础知识回顾-- 反射(1) 反射(reflection)是一种允许用户获得类型信息的C#特性.术语“反射”源自于它的工作方式: Type对象映射它所代表的底层对象.对Type对象进行查询可以 ...
- 黑马程序猿————Java基础日常笔记---反射与正則表達式
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 黑马程序猿----Java基础日常笔记---反射与正則表達式 1.1反射 反射的理解和作用: 首 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- Java基础教程:反射基础
Java基础教程:反射基础 引入反射 反射是什么 能够动态分析类能力的程序称为反射. 反射是一种很强大且复杂的机制. Class类 在程序运行期间,Java运行时系统始终为所有对象维护一个被称为运行时 ...
- 30天C#基础巩固-----多态,工厂模式
自己要有自信,相信自己可以找到好的工作.面对校招,企业更加看重自己的基础,这30天就把C#的基础好好的复习,学习下.笔记一定要认真的记录,这样自己复习回顾的时候就有了可以参考的东西了. 一: ...
- 基础命名空间:反射 using System.Reflection
反射概念: .Net的应用程序由几个部分:‘程序集(Assembly)’.‘模块(Module)’.‘类型(class)’组成,程序集包含模块 模块包含类型,类型又包含 成员,而反射提供一 ...
- Type.GetType()在跨程序集反射时返回null的解决方法
在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.Class ...
随机推荐
- sublime Text 2 制表符
写python的时候经常会有提示indent expected错误很常见,比如同一个文件有的是用空格敲出来的,有的是用tab键出来的这时候错误很难排查,这里说说在notepad++跟sublime下的 ...
- jQuery+ASP.NET MVC基于CORS实现带cookie的跨域ajax请求
这是今天遇到的一个实际问题,在这篇随笔中记录一下解决方法. ASP.NET Web API提供了CORS支持,但ASP.NET MVC默认不支持,需要自己动手实现.可以写一个用于实现CORS的Acti ...
- Linux3:more、which、find、chmod、tar、diff、grep、ps、netstat、uname
more 类似cat,不过more不是将整个文件内容从上到下显示在屏幕上的,而是以一页一页的显示方便使用者逐页阅读.more最基本的指令就是space即往下翻一页,b即往回翻一页显示,而且还有搜索字符 ...
- jq里延迟对象Deferred,状态变化后,会一直保持
var defer = $.Deferred(); defer.resolve('abc'); defer.done(function (data) { console.log(data); }) d ...
- python面向对象随笔
传送门:http://www.runoob.com/python/python-object.html
- MSP是什么?
本人在项目管理圈儿也算是摸爬滚打了几载,近几年真是各种压力大,看同行们各种参加培训.认证......我也不能懈怠啊,赶紧上网搜搜相关的培训和认证信息,不搜不知道一搜吓一跳.原本只知道PMP和PRINC ...
- Redis学习笔记~StackExchange.Redis实现分布式Session
回到目录 对于多WEB的环境现在已经是必须的了,很难想像一台WEB服务器面对百万并发的响应,所以,我们需要多台WEB服务器集群合作,来缓解这种高并发,高吞吐的场景,而对于多WEB的场景又会有个问题出现 ...
- 我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity
回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...
- DDD~领域服务的规约模式
回到目录 规 约(Specification)模式:第一次看到这东西是在microsoft NLayer项目中,它是微软对DDD的解说,就像petshop告诉了我们MVC如何使用一样,这个规约模式最重 ...
- Atitit.现在的常用gui技术与gui技术趋势评价总结
Atitit.现在的常用gui技术与gui技术趋势评价总结 1. Gui俩种分类: native 和 dsl 和 script1 2. 最好的跨平台gui技术h51 2.1. 几大技术体系(java ...