C# 程序集 和 反射
.Net反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为.Net的反射机制。
.Net反射机制主要提供了以下功能:
a.在程序运行时:动态 获取加载程序集; 动态获取类型(如类、接口等); 动态获取类型的成员信息(如方法,字段,属性等);
b.在运行时,动态创建(主要根据类名 或成员名 字符串动态创建)类型实例,以及 调用和 访问 这些 实例 成员;
1.反射-Assembly 程序集对象 using System.Reflection;
Assembly类 表示 某个程序集( .dll/exe )
获取程序集的方式:
获得当前程序域中 所有的Assembly:AppDomain.CurrentDomain.GetAssemblies()
获取当前 对象所在的Assembly:this.GetType().Assembly
根据路径加载Assembly :Assembly.LoadFrom(assPath)
2.反射- Type 类型对象
Type类,程序运行时一个class对应一个Type类的对象。通过Type对象可以获得类的所有的定义信息,比如类有哪些属性、哪些方法等。
获得Type对象的方式: 1,2为获得单个类型对象,3,4,5 通过程序集获取Type
1.通过类 获得对应Type:Typet =typeof(Person)
2.通过对象获得 Type:Typet =p.GetType()
3.根据类的全名称获取程序集中定义的类:Type type=Assembly.GetType("BLL.Person")
4.获取程序集中定义的所有的public类:Type[] types =assembly.GetExportedTypes()
5.获取程序集中定义的所有的类型:Type[] types =assembly.GetTypes()
反射- Type 的成员
属性:
?type.Assembly:获取type所在的程序集对象 ?type.FullName:获取type对象对应的类的全名称 ?type.Name: 获取type对象对应类的 名称 ?type.IsArray: 判断type是否为一个数组类 ?type.IsEnum: 判断type是否为一个枚举类 方法: ?type.IsAssignableFrom(Type i):判断type是否实现了接口i ?type.IsSubclassOf(Type father):判断type是否继承了father ?type.IsInstanceOfType(objecto):判断o是否为type类的实例 ?type.GetFiled("gender"):获取type中名为gender的字段对象 ?type.GetMethod("SayHi"):获取type中名为SayHi的方法对象 ?type.GetProperty("Age"):获取type中名为Age的属性对象
3.反射-FiledInfo字段对象
FiledInfo类代表某个类中的一个成员字段(类的全局变量)
例:操作对象的字段
publicclassDog
{
publicstringdogName;
publicintdogAge;
}
Dog dObj =newDog(){dogName="小花",dogAge=1 };
Type dType =dObj.GetType();
FiledInfo fiDN =dType.GetFiled("dogName");//获取字段对象
string strName =fiDN.GetValue(dObj);//获取dObj的dogName字段值
fiDN.SetValue(dObj,"小白");//设置dObj里的dogName字段值
4.反射-PropertyInfo属性对象
PropertyInfo类代表某个类中的一个属性
例:操作 对象 的属性
publicclassDog
{
publicstringName{get;set;}
publicintAge{get;set;}
}
Dog dObj =newDog(){Name="小花",Age=1};
Type dType =dObj.GetType();
PropertyInfo piN=dType.GetProperty("Name");//获取属性对象
string strName =piN.GetValue(dObj);//获取dObj的Name属性值
piN.SetValue(dObj,"小白");//设置dObj里的Name属性值
5.反射-MethodInfo方法对象
MethodInfo类 代表某个类中的一个方法
publicclassDog
{
publicstringSmile(string name)
{
return "一只会笑的狗:"+name;
}
}
Dog dObj =newDog();
Type dType =dObj.GetType();
MethodInfo method=dType.GetMethod("Smile"); //获取方法对象
object res1 = dObj.Smile("哇哈哈~~"); //*普通调用方法
object res2= method.Invoke(dObj,newobject[]{"小白"}); //*反射调用dObj的Smile方法
6.反射- 动态创建对象
1.objectres = Activator.CreateInstance(Typetype)
会动态调用类的无参构造函数创建一个对象,返回值就是创建的对象,如果类没有无参构造函数就会报错。
2.使用构造器创建
publicclass Dog{
public Dog(stringname,intage){//构造函数代码... }
}
Type dType =typeof(Dog);//获取Dog类类型 对象
//获取构造器 对象(根据 参数列表的 参数类型 数组 获取)
ConstructorInfocotr=dType.GetConstructor(new Type[]{typeof(string),typeof(int)} );objectresValue =cotr.Invoke(newobject[]{"小白",2});//调用dObj的Smile方法
7.反射 - 调用对象私有成员
Person p1 = new Person();
Type type = p1.GetType();
//BindingFlags.Instance表示是实例方法,也就是不是static方法
MethodInfom Haha = type.GetMethod("Haha", BindingFlags.NonPublic | BindingFlags.Instance);
mHaha.Invoke(p1,null);


C# 程序集 和 反射的更多相关文章
- 程序集与反射技术(C#)
首先我们来看程序集,程序集是代码进行编译是的一个逻辑单元,把相关的代码和类型进行组合,然后生成PE文件(例如可执行文件.exe和类库文件.dll).由于程序集在编译后并不一定会生成单个文件,而可能会生 ...
- 30天C#基础巩固----程序集,反射
一:认识程序集 只要是使用VS就会和程序集打交道,我们通过编辑和生产可执行程序就会自动生成程序集.那么什么事程序集呢,.net中的dll与exe文件的都是程序集(Assembly). ...
- C# 程序集 与 反射
程序集 对于C#程序员来说一定不陌生,不就是VS生成的那些exe,dll么.是的,程序集(.net中exe与dll的区别就是exe有程序接入口,即Main函数)就是.net框架下,可以被CLR加载并运 ...
- CLR、程序集、反射和控制反转
以前面试包括自己学习的时候经常会碰到这3个东西,也查过相关介绍,晦涩难懂,虽然看完之后,当时勉强理解,不过过一段时间又忘了.其实这篇文章可以分两篇(clr.程序集)和(反射.控制反转)来写,但它们之间 ...
- 反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性、字段),而不去使用Invoke方法)
反射-优化及程序集等(用委托的方式调用需要反射调用的方法(或者属性.字段),而不去使用Invoke方法) 创建Delegate (1).Delegate.CreateDelegate(Type, ...
- Type.GetType()在跨程序集反射时返回null的解决方法
在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用Type.GetType("BNameSpace.Class ...
- C#反射技术概念作用和要点
反射(Reflection)是.NET中的重要机制,通过放射,可以在运行时获得.NET中每一个类型(包括类.结构.委托.接口和枚举等)的成员,包括方法.属性.事件,以及构造函数等.还可以获得每个成员的 ...
- C#- 反射之 GetType()方法
Type.GetType()在跨程序集反射时返回null的解决方法 在开发中,经常会遇到这种情况,在程序集A.dll中需要反射程序集B.dll中的类型.如果使用稍有不慎,就会产生运行时错误.例如使用T ...
- [整理]C#反射(Reflection)详解
本人理解: 装配件:Assembly(程序集) 晚绑定:后期绑定 MSDN:反射(C# 编程指南) -----------------原文如下-------- 1. 什么是反射2. 命名空间与装配件的 ...
随机推荐
- 防止aspx木马的IIS SPY变态功能
防止aspx木马的IIS SPY变态功能 如果服务器支持aspx语言,而且被上传了aspx木马,利用木马里面的IIS SPY 功能,可以读出IIS里面的所有用户的密码,包括用IIS做FTP的,也能读出 ...
- STL中map的一个知识点
问题背景 在做USACO Section 1.1 Greedy Gift Givers的时候,我最初的想法是直接用一个map来进行数据处理.但是后来产生一个让我感到疑问的地方,后来我经过测试,发现了这 ...
- linux iptables 相关设置
首先在使用iptables之前敲入一下两条命令 > iptables -F #这句话的意思是清空所有的链 > iptables -X #这句话的意思是清空所有自定义的链 以上两条的含 ...
- HDU 1589 Find The Most Comfortable Road 最小生成树+枚举
find the most comfortable road Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K ...
- springMVC入门配置及helloworld实例
1. 新建web project 2. 往lib里copy必须的jar 3. 改写web.xml <?xml version="1.0" encoding="UTF ...
- android Makefile把jar包打到apk里
这个是经常的需求,我就是经常忘,关键不理解啊. 反反复复的也看看了android makefile. 太复杂了. 慢慢来吧.哎.工作十年.啥也不会.咋整? ## Copyright (C) 2008 ...
- ZOJ 3927 Programming Ability Test
水题,判断一下加起来是否大于等于80 #include<cstdio> #include<cstring> #include<cmath> #include< ...
- hadoop重新启动之后Datanode无法启动的问题
每次将hadoop重新启动之后我们查看进程就会发现,namenode成功启动,然而datanode却不能重新启动,格式化以后也不行,百思不得其解,最后在终于在厦门大学的一篇博客里面找到了解决的方法,我 ...
- 4、手把手教你Extjs5(四)主界面上加入顶部和底部区域
这一节为主界面加一个顶部区域和底部区域.一个管理系统的界面可以粗分为顶部标题部分.中间数据展示和处理的部分.底部备注和状态部分. 在增加这二个区域之前,我们先在MainModel.js中加入一些数据. ...
- Web开发中需要了解的东西
在StackExchange上有人问了这样一个问题:What should every programmer know about web development?(关于Web开发,什么是所有程序员需 ...