C# 反射浅析
反射是一个运行库类型发现的过程。通过反射可以得到一个给定程序集所包含的所有类型的列表,这个列表包括给定类型中定义的方法、字段、属性和事件。此外,通过反射也可以动态的发现一组给定类支持的接口、方法的参数和其他相关信息,例如基类、命名空间、数据清单等。
一、System.Reflection命名空间内的各类型
- Assembly
通过它可以加载、了解和操纵一个程序集。
- AssemblyName
通过它可以找到大量隐藏在程序集的身份中德信息,如版本信息、区域信息。
- EventInfo
事件的信息
- FieldInfo
字段的信息
- MethodInfo
方法的信息
- ParameterInfo
参数的信息
- PropertyInfo
属性信息
- MemberInfo
是抽象基类,为EventInfo、FieldInfo、MethodInfo、PropertyInfo等类型定义了公共的行为。
- Module
用来访问带有多文件程序集的给定模块。
二、System.Type类
- Is***
用来检查一个类型的元数据,如IsAbstract、IsClass、IsValueType等等。
- Get***
用来从类型得到指定项目,如GetEvent()得到类型的一个指定的事件(EventInfo)。
另外,这些方法都有一个单数版本和一个复数版本。如GetEvent()对应有一个复数版本GetEvents()。
- FindMembers()
根据查询条件返回一个MemberInfo类型的数组。
- GetType()
该静态方法根据一个字符串名称返回一个Type实例。
- InvokeMember()
对给定项目进行晚期绑定。
三、得到一个Type类型实例的三种方法
- 使用System.Object.GetType()
Person pe = new Person();
Type t = pe.GetType();
- 使用Sytem.Type.GetType()静态方法,参数为类型的完全限定名
Type t = Type.GetType("Entity.Person");
该方法被重载,允许指定两个布尔类型的参数,一个用来控制当前类型不能找到时是否抛出异常,另一个用来指示是否区分字符串大小写。
Type t = Type.GetType("Entity.Person",false,true);
注意到传入的字符串并没有包含类型所在的程序集信息,此时该类型便被认为是定义在当前执行的程序集中的。
要得到一个外部私有程序集的类型元数据时,字符串参数必须使用类型完全限定名加上类型所在程序集的友好名字。
Type t = Type.GetType("Entity.Person","Entity");
"Entity"即为类型所在程序集的友好名字 嵌套类型:传入的字符串可以指定一个+标记来表示一个嵌套类型,如希望得到一个嵌套在person类中的枚举类型City的类型信息,则可以这样
Type t = Type.GetType("Entity.person+City");
- 使用typeof运算符
Type t = typeof(person);
三种方法的比较:
第一种方法必须先建立一个实例,而后两种方法不必先建立实例。但使用typeof运算符仍然需要知道类型的编译时信息,而使用System.Type.GetType()静态方法不需要知道类型的编译时信息,所以是首选方法。
四、最简单的C#反射实例
namespace ReflectionTest
{
public class WriteTest
{
public void WriteString(string s, int i)
{
Console.WriteLine("WriteString:" + s + i.ToString());
} public static void StaticWriteString(string s)
{
Console.WriteLine("StaticWriteString:" + s);
} public static void NoneParaWriteString()
{
Console.WriteLine("NoParaWriteString");
}
}
}
namespace TestApp
{
class Program
{
static void Main(string[] args)
{
Assembly ass;
Type type;
Object obj; Object any = new Object();
ass = Assembly.LoadFile(@"F:\GitHub\ReflectionStudy\TestApp\ReflectionStudy.dll");
type = ass.GetType("ReflectionTest.WriteTest"); MethodInfo method = type.GetMethod("WriteString");
string test = "test";
int i = ;
Object[] paramethors = new Object[] { test, i };
obj = ass.CreateInstance("ReflectionTest.WriteTest");
method.Invoke(obj, paramethors); method = type.GetMethod("StaticWriteString");
method.Invoke(null, new string[] { "test" });
method.Invoke(obj, new string[] { "test" });
method.Invoke(any, new string[] { "test" }); method = type.GetMethod("NoneParaWriteString");
method.Invoke(null, null);
}
}
}
从上面的总结中可以看出,对于外部调用的动态库应用反射时要用到Assembly.LoadFile(),然后才是获取类型、执行方法等;当用反射创建当前程序集中对象实例或执行某个类下静态方法时只需通过Type.GetType("类的完整名")。
C# 反射浅析的更多相关文章
- Javaweb中提到的反射浅析(附源码)
反射:一个jdk5.0的新特性,高级运用.在后期的框架中,这个是一大重点,现在估计我们都不会太多的接触他的.但是为了后面的铺垫,我想还是先了解一下: 先构造一个类,然后我们用反射来获取,调用里面的方法 ...
- 浅析Java反射机制
目前,在项目中使用Java反射机制(除Spring框架)的地方不多,但为后续准备,简单将最近的反射体会总结如下: 1. 按光学中的反射,可以将java中的反射理解为“镜像”.有以下用途: Java反射 ...
- Java 反射机制浅析
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...
- 浅析Java中的反射机制原理
反射反射,程序员的快乐! Java中反射机制使用的还是比较广泛的,系统的灵活性.可扩展性大都都是通过反射等方式来加载外部插件,使得系统与插件解耦的同时,增加了功能.但是很多人都只是会用,却是不知道它的 ...
- Java反射机制浅析
概念 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语 ...
- 浅析Java RTTI 和 反射的概念
一.概念: RTTI(Run-Time Type Identification,运行时类型识别)的含义就是在运行时识别一个对象的类型,其对应的类是Class对象,怎么理解这个Class对象呢?如果说类 ...
- 关于反射的BindingFlag浅析
MSDN关于BindingFlag的文档地址:https://msdn.microsoft.com/zh-cn/library/cexkb29a BindFlags作为一个特别的标志量,在反射中通过这 ...
- TFTP反射放大攻击浅析
0x00 前言 经由@杀戮提示,让我看看softpedia上的这篇报道,咱就来研究一下文中的使用TFTP(Trivial File Transfer Protocol,简单文件传输协议)进行反射型DD ...
- < 转>Java 反射机制浅析
一.什么是反射: 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领 域关于应用反射性的研究.它首先被程序 ...
随机推荐
- 使用jquery-qrcode生成二维码
一.使用jquery-qrcode生成二维码 先简单说一下jquery-qrcode,这个开源的三方库(可以从https://github.com/jeromeetienne/jquery-qrcod ...
- 使用httpclient发送http请求
先来个httpclient的maven依赖 <dependency> <groupId>org.apache.httpcomponents</groupId> &l ...
- linux 时间管理——概念、注意点(一)【转】
转自:http://www.cnblogs.com/openix/p/3324243.html 参考:1.http://bbs.eyeler.com/thread-69-1-1.html ...
- Android EditText中插入话题模块的删除处理方法
在 EditText 中添加话题 或者是 @某人 时 看起来挺简单,实际操作会有很多坑爹的问题 private String mTopic: //光标保持在话题的末尾 mInputEdit.setOn ...
- 关于webrtc视频会议的解决方案
以我的经验来看视频会议分两种模式:网状模型,星型 1.网状模型 所谓的网状模型就是参加会议的人中每两个人建立一个点对点的连接. 比如:一个会议室有三个人A,B,C 基于网络模型就需要这样: 1.A和B ...
- angular学习之关于ng-class详解
1,定义和用法 ng-class 指令用于给 HTML 元素动态绑定一个或多个 CSS 类. ng-class 指令的值可以是字符串,对象,或一个数组. 如果是字符串,多个类名使用空格分隔. 如果是对 ...
- 20160929001 Guid生成
全局唯一标识符(GUID,Globally Unique Identifier)是一种由算法生成的二进制长度为128位的数字标识符. using System; namespace GUID测试 ...
- 使用discovery板上的st-link给别的板子下载
discovery板上的6pin swd接口 20pin 的jtag 接线: 6 20 def 1 1 目标vdd 2 9 swclk(PA14) 3 20 gnd 4 7 swdio(PA13) ...
- [程序设计语言]-[核心概念]-02:名字、作用域和约束(Bindings)
本系列导航 本系列其他文章目录请戳这里. 1.名字.约束时间(Binding Time) 在本篇博文开始前先介绍两个约定:第一个是“对象”,除非在介绍面向对象语言时,本系列中出现的对象均是指任何可以有 ...
- 封装好的AFN网络请求框架和MBProgress
demo:https://github.com/IMCCP/CCPAFNNetworking(收藏下来)