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 = ;
  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 = ;
  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 = ;
  62. foreach (ParameterInfo para in parameters)
  63. {
  64. if (index++ < parameters.Length - )
  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 = ;
  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 = ;
  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[];
  110. parameters[] = ;
  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[];
  126. parameters[] = ;
  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[];
  144. parameters[] = ;
  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[];
  170. methodParams[] = 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[];
  175. parameters[] = ;
  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[];
  201. methodParams[] = 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 = ;
  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. }

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

  1. Java 反射机制详解(下)

    续:Java 反射机制详解(上) 三.怎么使用反射 想要使用反射机制,就必须要先获取到该类的字节码文件对象(.class),通过字节码文件对象,就能够通过该类中的方法获取到我们想要的所有信息(方法,属 ...

  2. Java 反射机制详解(上)

    一.什么是反射 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java ...

  3. Java反射机制详解

    Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为Java语言的反 ...

  4. Java中反射机制详解

    序言 在学习java基础时,由于学的不扎实,讲的实用性不强,就觉得没用,很多重要的知识就那样一笔带过了,像这个马上要讲的反射机制一样,当时学的时候就忽略了,到后来学习的知识中,很多东西动不动就用反射, ...

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

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  6. Java 反射机制详解

    动态语言 动态语言,是指程序在运行时可以改变其结构:新的函数可以被引进,已有的函数可以被删除等在结构上的变化.比如众所周知的ECMAScript(JavaScript)便是一个动态语言.除此之外如Ru ...

  7. Java反射机制详解(3) -java的反射和代理实现IOC模式 模拟spring

    IOC(Inverse of Control) 可翻译为“控制反转”,但大多数人都习惯将它称为“依赖注入”.在Spring中,通过IOC可以将实现类.参数信息等配置在其对应的配置文件中,那么当 需要更 ...

  8. Java反射机制详解(1) -反射定义

    首先,我们在开始前提出一个问题: 1.在运行时,对于一个java类,能否知道属性和方法:能否去调用它的任意方法? 答案是肯定的. 本节所有目录如下: 什么是JAVA的反射机制 JDK中提供的Refle ...

  9. [转]Java反射机制详解

    目录 1反射机制是什么 2反射机制能做什么 3反射机制的相关API ·通过一个对象获得完整的包名和类名 ·实例化Class类对象 ·获取一个对象的父类与实现的接口 ·获取某个类中的全部构造函数 - 详 ...

  10. Java_反射机制详解

    本篇文章依旧采用小例子来说明,因为我始终觉的,案例驱动是最好的,要不然只看理论的话,看了也不懂,不过建议大家在看完文章之后,在回过头去看看理论,会有更好的理解. 下面开始正文. [案例1]通过一个对象 ...

随机推荐

  1. oracle中的rowid--伪列-删除表中的重复内容-实用

    1.rowid是一个伪列,是用来确保表中行的唯一性,它并不能指示出行的物理位置,但可以用来定位行. 2.rowid是存储在索引中的一组既定的值(当行确定后).我们可以像表中普通的列一样将它选出来. 3 ...

  2. Bootstrap的datepicker控件

    为input 控件的text 添加datepicker()方法后,原本的控件change事件无法正常触发.原因是项目中同时使用了用了jquery ui,碰巧它里面也有一个datepicker,名字一模 ...

  3. android 根据网络来获取外网ip地址及国家,地区的接口

    新浪的IP地址查询接口:http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 新浪多地域测试方法:http://int.dpool. ...

  4. CSS3实现图片鼠标悬浮放大效果

    .excerpt .focus a img{ -webkit-transition: all ease .3s; transition: all ease .3s }.excerpt .focus a ...

  5. 简单的FTP上传下载(java实现 swing界面)

    /** *阅读前请自己在win7上建立FTP主机 *具体步骤如:http://jingyan.baidu.com/article/574c5219d466c36c8d9dc138.html * 然后将 ...

  6. SQL Performance Improvement Techniques(转)

    原文地址:http://www.codeproject.com/Tips/1023621/SQL-Performance-Improvement-Techniques This article pro ...

  7. hibernate联合主键注解配置

    在网上看到好多方法,结果拿来用还是出现了一些问题.现在整理一下 1.主键类 import javax.persistence.Column; public class UserRoleUionPK i ...

  8. Android 部分机型GridView四周默认间距

    在测试兼容性时候,部分机型,比如联想和一加等手机,在使用Gridview的时候,会默认四周有默认边距,10dp左右. 这时候需要设置 android:listSelector="@andro ...

  9. 使用事件CreateEvent注意事项

    HANDLECreateEvent( LPSECURITY_ATTRIBUTESlpEventAttributes,// 安全属性 BOOLbManualReset,// 复位方式 BOOLbInit ...

  10. POJ 1631 Bridging signals & 2533 Longest Ordered Subsequence

    两个都是最长上升子序列,所以就放一起了 1631 因为长度为40000,所以要用O(nlogn)的算法,其实就是另用一个数组c来存储当前最长子序列每一位的最小值,然后二分查找当前值在其中的位置:如果当 ...