C#反射机制

1.反射概念:审查元数据并收集关于它的类型信息的能力。元数据(编译以后的最基本数据单元)就是一大堆的表,当编译程序集或者模块时,编译器会创建一个类定义表,一个字段定义表,和一个方法定义表等。

2.反射的层次模型:

3.反射类型的接口:

  如果你想要获得一个类型继承的所有接口集合,可以调用Type的FindInterfaces GetInterface或者GetInterfaces。所有这些方法只能返回该类型直接继承的接口,他们不会返回从一个接口继承下来的接口。要想返回接口的基础接口必须再次调用上述方法

 

 

4.System.Type的大多数方法都用于获取对应数据类型的成员信息:构造函数、属性、方法和事件等

如:

  1.  /// <summary>   
  2. /// 运行所有方法   
  3.  /// </summary>   
  4.  public void RunMethods()   
  5.  {   
  6. string strClass = ConfigurationSettings.AppSettings["DBHeper"].ToString();   
  7.  Assembly assembly = Assembly.Load("Adapter");   
  8.  Type[] types = assembly.GetTypes();   
  9.  foreach (Type type in types)   
  10.  {   
  11.  MethodInfo[] methods = type.GetMethods();   
  12.  foreach (MethodInfo method in methods)   
  13. {   
  14.  method.Invoke(nullnull);   
  15.  }   
  16.  }   
  17.  }

 

 
 

5.

反射示例

 

  1.  int i = 42;   
  2.  System.Type type = i.GetType();   
  3. System.Console.WriteLine(type);

 

  输出为:System.Int32

 

 

  1. System.Reflection.Assembly info = typeof(System.Int32).Assembly;   
  2.  System.Console.WriteLine(info);

 

  输出为:mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089System.Type

 

6.数据反射单个程序集:

  上面的方法讲的是反射AppDomain的所有程序集,我们可以显示的调用其中的一个程序集,system.reflecton.assembly 类型提供了下面三种方法:

  1、Load 方法:极力推荐的一种方法,Load 方法带有一个程序集标志并载入它,Load 将引起CLR把策略应用到程序集上,先后在全局程序集缓冲区,应用程序基目录和私有路径下面查找该程序集,如果找不到该程序集系统抛出异常

  2、LoadFrom 方法:传递一个程序集文件的路径名(包括扩展名),CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,和公钥信息,如果在指定路径找不到程序集抛出异常。

 

Assembly.LoadFrom()的应用:

  App.config配置文件信息

 

  1. <assembly name="SMSSender" ThreadCount="1" class="SMSSender.LDKSMSSender" path="SMSSender.dll">   
  2.  </assembly>

 

  程序中的调用

 

  1. Assembly assembly = Assembly.LoadFrom(Server.MapPath(assemblyPath));   
  2. ISaaSProcess proc = assembly.CreateInstance(assemblyObj.Class) as ISaaSProcess;

 

  Load 方法:极力推荐的一种方法,Load 方法带有一个程序集标志并载入它,Load 将引起CLR把策略应用到程序集上,先后在全局程序集缓冲区,应用程序基目录和私有路径下面查找该程序集,如果找不到该程序集系统抛出异常

  LoadFrom 方法:传递一个程序集文件的路径名(包括扩展名),CLR会载入您指定的这个程序集,传递的这个参数不能包含任何关于版本号的信息,区域性,和公钥信息,如果在指定路径找不到程序集抛出异常。

 

7.反射的作用:

  1、可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型

  2、应用程序需要在运行时从某个特定的程序集中载入一个特定的类型,以便实现某个任务时可以用到反射。

  3、反射主要应用与类库,这些类库需要知道一个类型的定义,以便提供更多的功能。

  应用要点:

  1、现实应用程序中很少有应用程序需要使用反射类型

  2、使用反射动态绑定需要牺牲性能

  3、有些元数据信息是不能通过反射获取的

  4、某些反射类型是专门为那些clr 开发编译器的开发使用的,所以你要意识到不是所有的反射类型都是适合每个人的。

  示例:

  App.config配置文件信息

 

  1. <configuration>   
  2. <appSettings>   
  3.  <add key="DBHeper" value="Adapter.SQLHelper"/>   
  4.  <!--<add key="DBHeper" value="Adapter.OracleHelper"/>-->   
  5.  </appSettings>   
  6.  </configuration>

 

  程序中的调用

 

  1.  private IDBHelper DbHelper = GetDBHelper();   
  2.  public static IDBHelper GetDBHelper()   
  3. {   
  4.  string strClass = ConfigurationSettings.AppSettings["DBHeper"].ToString();   
  5. Assembly assembly = Assembly.Load("Adapter");   
  6.  IDBHelper dbHelper = assembly.CreateInstance(strClass) as IDBHelper;   
  7.  return dbHelper;   
  8.  }

 

  即可通过配置文件来选择系统是选择SQL数据库还是Oracle。

 

8.System.reflection命名空间包含的几个类,允许你反射(解析)这些元数据表的代码

 

System.Reflection.Assembly
System.Reflection.MemberInfo
System.Reflection.EventInfo
System.Reflection.FieldInfo
System.Reflection.MethodBase
System.Reflection.ConstructorInfo
System.Reflection.MethodInfo
System.Reflection.PropertyInfo
System.Type

 

  以下是上面几个类的使用方法:

  (1)使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。

  (2)使用Module了解包含模块的程序集以及模块中的类等,还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。

  (3)使用ConstructorInfo了解构造函数的名称、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetConstructors或 GetConstructor方法来调用特定的构造函数。

  (4)使用MethodInfo了解方法的名称、返回类型、参数、访问修饰符(如pulic 或private)和实现详细信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法。

  (5)使用FiedInfo了解字段的名称、访问修饰符(如public或private)和实现详细信息(如static)等,并获取或设置字段值。

  (6)使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。

  (7)使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。

  (8)使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值