今天就泛泛用到的非常多的反射这个技术来做一个总结,固然关于反射需要讲解的对象实在是太多的内容,在一片文章中想要讲解清楚长短常难的,本篇博客也是就本身本人对这些内容学习后的一个总结,固然包孕看书和本身写过的一些代码中抽取的一些示例,而且本文也仅限于此时对付这个常识点的理解,但愿通过以后的逐步学习能够不停加深对这个常识点的理解。
首先来看看对付反射的根本常识点。
1 界说:首先看看MSDN怎样对它进行解释吧
反射供给了封装措施集、模块和类型的东西(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有东西,或从现有东西获取类型并挪用其要领或访谒其字段和属性。如果代码中使用了属性,可以操作反射对它们进行访谒。
2 反射有什么感化?
A、将类型绑定到现有东西,或从现有东西中获取类型信息,这些信息包孕(Assembly MemberInfo EventInfo FieldInfo MethodBase ConstructorInfo MethodInfo PropertyInfo 等等 )此外可以使用反射动态地创建类型的实例,
例如:
1、System.Activator 的CreateInstance要领。该要领返回新东西的引用。
2、System.Activator 的CreateInstanceFrom 与上一个要领类似,不过需要指定类型及其措施集
3、System.Appdomain 的要领:CreateInstance,CreateInstanceAndUnwrap,CreateInstranceFrom和CreateInstraceFromAndUnwrap
4、System.Type的InvokeMember 实例要领:这个要领返回一个与传入参数相符的结构函数,并结构该类型。
5、System.Reflection.Constructinfo 的Invoke实例要领
下面通过一段代码来了解这5种创建实例的要领
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Reflection; using System.Diagnostics; using OptimizeReflection; using System.Collections; using System.Web; namespace TestOptimizeReflection { public class OrderInfo { public int OrderID { get; set; } public DateTime OrderDate { get; set; } public decimal SumMoney { get; set; } public string Comment { get; set; } public bool Finished { get; set; } public int Add(int a, int b) { return a + b; } } class Program { static void Main() { TestNewInstance(); } static void TestNewInstance() { //通例要领创建东西 OrderInfo testObj = new OrderInfo(); #region 通例反射创建 //操作反射来动态创建东西 Type instanceType = typeof(OrderInfo); OrderInfo orderInfo = (OrderInfo)Activator.CreateInstance(instanceType); #endregion #region Activator.CreateInstanceFrom 创建 //注意Assembly.GetEntryAssembly().CodeBase暗示当前执行的exe地址的路径,instanceType.FullName暗示当前OrderInfo的类型名称TestOptimizeReflection.OrderInfo System.Runtime.Remoting.ObjectHandle oh= Activator.CreateInstanceFrom(Assembly.GetEntryAssembly().CodeBase, instanceType.FullName); //返回被包装的东西 OrderInfo orderInfoEx = (OrderInfo)oh.Unwrap(); #endregion #region System.AppDomain.CurrentDomain实例创建东西 System.Runtime.Remoting.ObjectHandle ohEx = System.AppDomain.CurrentDomain.CreateInstance(Assembly.GetEntryAssembly().FullName, instanceType.FullName); OrderInfo orderInfoExEx = (OrderInfo)ohEx.Unwrap(); //合并上面的两步 OrderInfo orderInfoExExEx = (OrderInfo)System.AppDomain.CurrentDomain.CreateInstanceAndUnwrap(Assembly.GetEntryAssembly().FullName, instanceType.FullName); #endregion #region InvokeMember要领创建实例 OrderInfo invokeMemberOrderInfo = (OrderInfo)instanceType.InvokeMember(null, BindingFlags.Public| BindingFlags.Instance | BindingFlags.Static|BindingFlags.CreateInstance, System.Type.DefaultBinder, null, null); #endregion #region 挪用结构器创建 //挪用无参数的默认结构函数 ConstructorInfo ci = instanceType.GetConstructor(new Type[] { }); OrderInfo ciOrderInfo = (OrderInfo)ci.Invoke(null); #endregion } } }
B、应用措施需要在运行时从某个特定的措施集中载入一个特定的类型,以便实现某个任务时可以用到反射。
这个该怎样去理解呢?这个可以用插件系统中的同类思想去解释,在构建插件系统的时候,,我们有时候需要主措施去动态地挪用插件,可能应用措施只有在执行某一操纵的时候才华够去挪用相关的DLL,这个时候我们就可以通过反射这种方法来动态挪用dll中分特定要领或者类型,这个也是经常使用到的。
C、反射主要应用与类库,这些类库需要知道一个类型的界说,以便供给更多的成果。
D、反射能够挪用一些私有要领和字段等。