(转)C#反射机制详解

  1 反射的定义:审查元数据并收集关於它的类型信息的能力,元数据(编辑后的基本数据单元)就是一大堆表,编译器会创建一个类定义表,一个字段定义表,一个方法定义表等,System.Reflection命名空间包含的几个类,允许你反射(解析)这些元数据的代码
  2
  3 一、反射的作用:
  4 动态的创建类型的实例,将类型邦定到现有对象,或从现有对象中获取类型
  5 应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射
  6 反射主要应用於类库,这些类库需要知道一个类型的定义,以便提供更多的功能
  7
  8 二、应用要点:
  9 现实应用程序中很少使用到反射
 10 使用反射动态邦定需要牺牲性能
 11 有些元数据信息是不能通过反射获取的
 12 某些反射类型是专门為那些CLR开发编辑器开发使用的,所以你要意思到不是所有反射类型都是可以使用的
 13
 14 三、取得Assembly的方法:
 15 Assembly.Load
 16 Assembly.LoadFile
 17 Assembly.LoadFrom
 18 Type对象的Assembly方法
 19
 20 四、反射的成员:
 21 MemberInfo-成员
 22 ConstructorInfo-结构
 23 FieldInfo-字段
 24 MethodInfo-方法
 25 PropertyInfo-属性
 26 EventInfo-事件
 27
 28 五、根据反射取得对象的Member信息
 29 private void WriteReflectionInfo()
 30 {
 31 Type testType = typeof(Test);
 32 Assembly assembly = testType.Assembly;
 33 Response.Write("Assembly:" + assembly.FullName + "<br/>");
 34 Type[] typeList = assembly.GetTypes(); // 获取类型
 35 // 针对每个类型获取详细信息
 36 foreach (Type type in typeList)
 37 {
 38 Response.Write("------------------------" + type.Namespace + type.Name + "------------------------<br/>");
 39 // 获得类型的结构信息
 40 ConstructorInfo[] constructs = type.GetConstructors();
 41
 42 // 获得类型的字段信息
 43 FieldInfo[] fields = type.GetFields();
 44 Response.Write("<b>类的公共字段信息如下:</b>" + "<br/>");
 45 int a1 = 1;
 46 foreach (FieldInfo field in fields)
 47 {
 48 Response.Write((a1++).ToString() + ". " + field.Name + "<br/>");
 49 }
 50
 51 // 获得方法信息
 52 MethodInfo[] methods = type.GetMethods();
 53
 54 Response.Write("<b>类的公共方法如下:</b>" + "<br/>");
 55 int a2 = 1;
 56 foreach (MethodInfo method in methods)
 57 {
 58 ParameterInfo[] parameters = method.GetParameters();
 59 ParameterInfo reparam = method.ReturnParameter;
 60 Response.Write((a2++).ToString() + ". " + reparam.ParameterType.Name + " " + method.Name + "(");
 61 int index = 0;
 62 foreach (ParameterInfo para in parameters)
 63 {
 64 if (index++ < parameters.Length - 1)
 65 Response.Write(para.ParameterType.Name + " " + para.Name + ",");
 66 else
 67 Response.Write(para.ParameterType.Name + " " + para.Name);
 68 }
 69 Response.Write(")<br/>");
 70 }
 71
 72 // 获得属性的信息
 73 PropertyInfo[] propertys = type.GetProperties();
 74
 75 Response.Write("<b>类的公共属性如下:</b>" + "<br/>");
 76 int a3 = 1;
 77 foreach (PropertyInfo pro in propertys)
 78 {
 79 Response.Write((a3++).ToString() + ". " + pro.PropertyType.Name + " " + pro.Name + "{");
 80 if (pro.CanRead) Response.Write("get;");
 81 if (pro.CanWrite) Response.Write("set;");
 82 Response.Write("}<br/>");
 83 }
 84 // 获得事件信息
 85 EventInfo[] events = type.GetEvents();
 86
 87 Response.Write("<b>类的成员如下:</b>" + "<br/>");
 88 // 获得成员
 89 int a4 = 1;
 90 foreach (MemberInfo mi in type.GetMembers())
 91 {
 92 Response.Write((a4++).ToString() + ". " + mi.MemberType.ToString() + " : " + mi.Name + "<br/>");
 93 }
 94 }
 95
 96 六、动态创建对象
 97 Assembly对象的 CreateInstance方法
 98 Activator. CreateInstance方法
 99 Type对象的 InvokeMember方法
100 // 使用Assembly的CreateInstance方法来取得对象的实例
101 private void Assembly_CreateInstance()
102 {
103 string assemblyName = "SqlModel";
104 string className = assemblyName + ".Member";
105 // 创建无参数实例
106 IDAL.IMember member = (IDAL.IMember)Assembly.Load(assemblyName).CreateInstance(className);
107 Response.Write("创建无参数实例:" + member.ID + "<br/>");
108 // 创建有参数实例
109 Object[] parameters = new Object[1];
110 parameters[0] = 10000;
111 IDAL.IMember member1 = (IDAL.IMember)Assembly.Load(assemblyName).CreateInstance(className, false, BindingFlags.Default, null, parameters, null, null);
112 Response.Write("创建有参数实例:" + member1.ID + "<br/>");
113 }
114
115 // 使用Activator的CreateInstance方法来取得对象的实例
116 private void Activator_CreateInstance()
117 {
118 string assemblyName = "SqlModel";
119 string className = assemblyName + ".Member";
120 // 创建无参数实例
121 System.Runtime.Remoting.ObjectHandle obj = Activator.CreateInstance(assemblyName, className);
122 IDAL.IMember member = (IDAL.IMember)obj.Unwrap();
123 Response.Write("创建无参数实例:" + member.ID + "<br/>");
124 // 创建有参数实例
125 Object[] parameters = new Object[1];
126 parameters[0] = 10000;
127 System.Runtime.Remoting.ObjectHandle obj1 = Activator.CreateInstance(assemblyName, className, false, BindingFlags.CreateInstance, null, parameters, null, null, null);
128 IDAL.IMember member1 = (IDAL.IMember)obj1.Unwrap();
129 Response.Write("创建有参数实例:" + member1.ID + "<br/>");
130 }
131
132 // 使用Type的InvokeMember方法来取得对象的实例
133 private void Type_InvokeMember()
134 {
135 string assemblyName = "SqlModel";
136 string className = assemblyName + ".Member";
137 Assembly assem = Assembly.Load(assemblyName);
138 Type type = assem.GetType(className); // 註意这里如果使用Type.GetType来取得Type的话,那麼assemblyName指定的类一定要是强命名的
139 // 创建无参数实例
140 IDAL.IMember member = (IDAL.IMember)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, null);
141 Response.Write("创建无参数实例:" + member.ID + "<br/>");
142 // 创建有参数实例
143 Object[] parameters = new Object[1];
144 parameters[0] = 10000;
145 IDAL.IMember member1 = (IDAL.IMember)type.InvokeMember(className, BindingFlags.CreateInstance, null, null, parameters);
146 Response.Write("创建有参数实例:" + member1.ID + "<br/>");
147 }
148
149 七、动态调用对象方法
150
151 Type对象的 InvokeMember方法
152 MethodInfo对象的Invoke方法
153 // Type对象的 InvokeMember方法来动态调用方法
154 private void InvokeMember()
155 {
156 string assemblyName = "SqlModel";
157 string className = assemblyName + ".Member";
158 string methodName = String.Empty;
159 string result = String.Empty;
160 Assembly assem = Assembly.Load(assemblyName);
161 Object obj = assem.CreateInstance(className);
162 Type type = assem.GetType(className); // 註意这里如果使用Type.GetType来取得Type的话,那麼assemblyName指定的类一定要是强命名的
163 // 动态调用无参数的方法
164 methodName = "GetName";
165 result = (string)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, null);
166 Response.Write(methodName + "方法的返回值:" + result + "<br/>");
167 // 动态调用有参数的方法
168 methodName = "Update";
169 Object[] methodParams = new Object[1];
170 methodParams[0] = DateTime.Now;
171 result = (string)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, methodParams);
172 Response.Write(methodName + "方法的返回值:" + result + "<br/>");
173 // 动态调用参数构架函数的带有参数的方法
174 Object[] parameters = new Object[1];
175 parameters[0] = 10000;
176 obj = assem.CreateInstance(className,false,BindingFlags.CreateInstance, null, parameters, null, null);
177 result = (string)type.InvokeMember(methodName, BindingFlags.InvokeMethod, null, obj, methodParams);
178 Response.Write(methodName + "方法的返回值:" + result + "<br/>");
179 }
180
181 // MethodInfo对象的Invoke方法来动态调用方法
182
183 private void MethodInfo_Invoke()
184 {
185 string assemblyName = "SqlModel";
186 string className = assemblyName + ".Member";
187 string methodName = String.Empty;
188 string result = String.Empty;
189
190 Assembly assem = Assembly.Load(assemblyName);
191 Object obj = assem.CreateInstance(className);
192 Type type = assem.GetType(className); // 註意这里如果使用Type.GetType来取得Type的话,那麼assemblyName指定的类一定要是强命名的
193 // 动态调用无参数的方法
194 methodName = "GetName";
195 MethodInfo methodInfo = type.GetMethod(methodName);
196 result = (string)methodInfo.Invoke(obj, null);
197 Response.Write(methodName + "方法的返回值:" + result + "<br/>");
198 // 动态调用有参数的方法
199 methodName = "Update";
200 Object[] methodParams = new Object[1];
201 methodParams[0] = DateTime.Now;
202 MethodInfo method = type.GetMethod(methodName);
203 result = (string)method.Invoke(obj, methodParams);
204 Response.Write(methodName + "方法的返回值:" + result + "<br/>");
205 }
206
207 --------------------------------------------------------------------------------
208 以上所使用的SqlModel.Member為:
209 新建一个SqlModel类库,在其下建立一个Member的类
210
211 namespace SqlModel
212 {
213 public class Member : IDAL.IMember
214 {
215 private int _id = 100;
216 public int ID
217 {
218 get { return _id; }
219 set { _id = value; }
220 }
221 private string _name = "limin";
222 public string Name
223 {
224 get { return _name; }
225 set { _name = value; }
226 }
227
228 public Member() { }
229 public Member(int id)
230 {
231 _id = id;
232 }
233
234 private void Init()
235 { }
236
237 public string GetName()
238 {
239 return _name;
240 }
241 public string Update (DateTime cdate)
242 {
243 return "{" + String.Format("ID:{0},Name:{1},CreateDate:{2}",_id,_name,cdate) + "}";
244 }
245 }
246 }
时间: 2024-08-02 22:53:30

(转)C#反射机制详解的相关文章

Java反射机制详解

Java反射机制详解 Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反射机制. 1.关于Class 1.Class是一个类,一个描述类的类(也就是描述类本身),封装了描述方法的Method,描述字段的Filed,描述构造器的Constructor等属性    2.对象照镜子后(反射)可以得到的信息:某个类的数据成员名.方法和构造器.某个类到底实现

Java 反射机制详解(下)

续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属性,类名,父类名,实现的所有接口等等),每一个类对应着一个字节码文件也就对应着一个Class类型的对象,也就是字节码文件对象. 获取字节码文件对象的三种方式.  1.Class class1= Class.forName("全限定类名"); //通过Class类中的静态方法forName,

Java中反射机制详解

序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射,所以回过头来把这个给重新补一下,自己欠下的债,迟早是要还的. ---WH 一.什么是反射? 在运行状态中,对于任意一个类,都能够获取到这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性(包括私有的方法和属性),这种动态获取的信息以及动态调用对象的方法的功能就称为java语言的

java 动态性之反射机制 详解 案例

1.反射机制 2.动态编译 3.动态执行javassript代码 4.动态字节码操作 动态语言 程序运行时,可以改变程序结构或变量类型.典型的语言: 1):Python.ruby.javascript等. 2):如下javascript代码: funtion test(){ var s ="var a=3;var b=5;alert(a+b);"; eval(s); } 3):C,C++,JAVA不是动态语言,JAVA可以称之为"准动态语言".但是JAVA有一定的动

Python 反射机制详解

本文和大家分享的主要是python反射机制相关内容,一起来看看吧,希望对大家学习python有所帮助. 对编程语言比较熟悉的朋友,应该知道"反射"这个机制.Python作为一门动态语言,当然不会缺少这一重要功能.然而,在网络上却很少见到有详细或者深刻的剖析论文.下面结合一个web路由的实例来阐述python的反射机制的使用场景和核心本质. 一.前言 1 def f1():2   print("f1是这个函数的名字!")3   4 s = "f1"

【转载】Java反射机制详解

转自:http://baike.xsoftlab.net/view/209.html#3_8 1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 2反射机制能做什么 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类: 在运行时构造任意一个类的对象: 在运行时判断任意一个类所具有的成员变量和方法: 在运行时调用任意一个

反射机制详解下篇

java的反射机制一共分为上下两篇,上篇请参考:http://xinsz08.blog.51cto.com/10565212/1946912 下篇主要讲解: 1.利用反射技术获取构造方法,并使用构造方法创建对象 2.使用反射技术快速创建对象 3.使用反射技术获取成员方法,并执行方法 4.反射技术小结. 1.使用反射技术获取构造方法,并使用构造方法创建对象 实现步骤: 1.获取class文件对象 (Class.forName) 2.使用class文件对象中的方法,解剖class文件获取构造方法Co

java反射机制详解 及 Method.invoke解释 getMethod

JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理.1. 得到某个对象的属性 public Object getProperty(Obje

java反射机制详解 及 Method.invoke解释

JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制.Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法:生成动态代理.1. 得到某个对象的属性 Java代码   public Object getProp

Java反射机制详解一

1反射机制是什么 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. 在面向对象的世界里,万事万物皆对象.在java语言里,静态的成员,普通数据类型是不是对象呢? 类又是谁的对象呢? 首先类是对象,类是java.lang.Class类的实例对象. 新创建一个Foo类 Foo这个类也是一个实例对象,是Class类的实例对象,这个对象在官网被称为(cl