1、对C#反射机制的理解
2、概念理解后,必须找到方法去完成,给出管理的主要语法
3、最终给出实用的例子,反射出来dll中的方法

反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等程序集内部的信息。使用反射可以看到一个程序集内部的接口、类、方法、字段、属性、特性等等信息。在System.Reflection命名空间内包含多个反射常用的类,下面表格列出了常用的几个类。
类型 作用 
Assembly 通过此类可以加载操纵一个程序集,并获取程序集内部信息 
EventInfo 该类保存给定的事件信息 
FieldInfo 该类保存给定的字段信息 
MethodInfo 该类保存给定的方法信息 
MemberInfo 该类是一个基类,它定义了EventInfo、FieldInfo、MethodInfo、PropertyInfo的多个公用行为 
Module 该类可以使你能访问多个程序集中的给定模块 
ParameterInfo 该类保存给定的参数信息       
PropertyInfo 该类保存给定的属性信息

一、System.Reflection.Assembly类
     通过Assembly可以动态加载程序集,并查看程序集的内部信息,其中最常用的就是Load()这个方法。
     Assembly assembly=Assembly.Load("MyAssembly");
     利用Assembly的object CreateInstance(string) 方法可以反射创建一个对象,参数0为类名。
二、System.Type类
     Type是最常用到的类,通过Type可以得到一个类的内部信息,也可以通过它反射创建一个对象。一般有三个常用的方法可得到Type对象。
利用typeof() 得到Type对象
Type type=typeof(Example);
利用System.Object.GetType() 得到Type对象
Example example=new Example();
Type type=example.GetType();
利用System.Type.GetType() 得到Type对象
Type type=Type.GetType("MyAssembly.Example",false,true);
注意参数0是类名,参数1表示若找不到对应类时是否抛出异常,参数1表示类名是否区分大小写
   例子:
   我们最常见的是利用反射与Activator结合来创建对象。
   Assembly assembly= Assembly.Load("MyAssembly");
   Type type=assembly.GetType("Example");
   object obj=Activator.CreateInstance(type);
三、反射方法
    1.通过 System.Reflection.MethodInfo能查找到类里面的方法

  1. Type type=typeof(Example);
  2. MethodInfo[] listMethodInfo=type.GetMethods();
  3. foreach(MethodInfo methodInfo in listMethodInfo)
  4. Cosole.WriteLine("Method name is "+methodInfo.Name);

2.我们也能通过反射方法执行类里面的方法2.我们也能通过反射方法执行类里面的方法

  1. Assembly assembly= Assembly.Load("MyAssembly");
  2. Type type=assembly.GetType("Example");
  3. object obj=Activator.CreateInstance(type);
  4. MethodInfo methodInfo=type.GetMethod("Hello World");  //根据方法名获取MethodInfo对象
  5. methodInfo.Invoke(obj,null);  //参数1类型为object[],代表Hello World方法的对应参数,输入值为null代表没有参数

四、反射属性
   1.通过 System.Reflection.PropertyInfo 能查找到类里面的属性
     常用的方法有GetValue(object,object[]) 获取属性值和 SetValue(object,object,object[]) 设置属性值
四、反射属性
   1.通过 System.Reflection.PropertyInfo 能查找到类里面的属性
     常用的方法有GetValue(object,object[]) 获取属性值和 SetValue(object,object,object[]) 设置属性值
四、反射属性
   1.通过 System.Reflection.PropertyInfo 能查找到类里面的属性
     常用的方法有GetValue(object,object[]) 获取属性值和 SetValue(object,object,object[]) 设置属性值

  1. Type type=typeof(Example);
  2. PropertyInfo[] listPropertyInfo=type.GetProperties();
  3. foreach(PropertyInfo propertyInfo in listPropertyInfo)
  4. Cosole.WriteLine("Property name is "+ propertyInfo.Name);

2.我们也可以通过以下方法设置或者获取一个对象的属性值2.我们也可以通过以下方法设置或者获取一个对象的属性值

  1. Assembly assembly=Assembly.Load("MyAssembly");
  2. Type type=assembly.GetType("Example");
  3. object obj=Activator.CreateInstance(type);
  4. PropertyInfo propertyInfo=obj.GetProperty("Name");    //获取Name属性对象
  5. var name=propertyInfo.GetValue(obj,null);                //获取Name属性的值
  6. PropertyInfo propertyInfo2=obj.GetProperty("Age");     //获取Age属性对象
  7. propertyInfo.SetValue(obj,34,null);                              //把Age属性设置为34

五、反射字段
    通过 System.Reflection.FieldInfo 能查找到类里面的字段
    它包括有两个常用方法SetValue(object ,object )和GetValue(object)  因为使用方法与反射属性非常相似,在此不再多作介绍
   (略)
六、反射特性
   通过System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一个类里面的特性,以下例子可以反射出一个类的所有特性
五、反射字段
    通过 System.Reflection.FieldInfo 能查找到类里面的字段
    它包括有两个常用方法SetValue(object ,object )和GetValue(object)  因为使用方法与反射属性非常相似,在此不再多作介绍
   (略)
六、反射特性
   通过System.Reflection.MemberInfo的GetCustomAttributes(Type,bool)就可反射出一个类里面的特性,以下例子可以反射出一个类的所有特性

  1. Type type=typeof("Example");
  2. object[] typeAttributes=type.GetCustomAttributes(false);       //获取Example类的特性
  3. foreach(object attribute in typeAttributes)
  4. Console.WriteLine("Attributes description is "+attribute.ToString());

通过下面例子,可以获取Example类Name属性的所有特性通过下面例子,可以获取Example类Name属性的所有特性

  1. public class Example
  2. {
  3. [DataMemberAttribute]
  4. publics string Name
  5. {get;set;}
  6. ..................
  7. }
  8. Type type = typeof(Example);
  9. PropertyInfo propertyInfo=type.GetProperty("Name");    //获取Example类的Name属性
  10. foreach (object attribute in propertyInfo.GetCustomAttributes(false))        //遍历Name属性的所有特性
  11. Console.WriteLine(“Property attribute: "+attribute.ToString());

总结:

Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的区别
在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:
    System.Reflection命名空间
    (1)   AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
    (2)   Assembly:程序集类
    (3)   Module:模块类
    (4)   Type:使用反射得到类型信息的最核心的类
    他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.

1,Assembly.Load()
    这个方法通过程序集的长名称(包括程序集名,版本信息,语言文化,公钥标记)来加载程序集的,会加载此程序集引用的其他程序集,一般情况下都应该优先使用 这个方法,他的执行效率比LoadFrom要高很多,而且不会造成重复加载的问题(原因在第2点上说明)
    使用这个方法的时候, CLR会应用一定的策略来查找程序集,实际上CLR按如下的顺序来定位程序集:
    ⑴如果程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集。
    ⑵如果程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件中的<codebase>元素指定的URL来查找
    ⑶如果没有指定强名称或是在GAC中找不到,CLR会探测特定的文件夹:
    假设你的应用程序目录是C:\AppDir,<probing>元素中的privatePath指定了一个路径Path1,你要定位的程序集是AssemblyName.dll则CLR将按照如下顺序定位程序集
    C:\AppDir\AssemblyName.dll
    C:\AppDir\AssemblyName\AssemblyName.dll
    C:\AppDir\Path1\AssemblyName.dll
    C:\AppDir\Path1\AssemblyName\AssemblyName.dll
    如果以上方法不能找到程序集,会发生编译错误,如果是动态加载程序集,会在运行时抛出异常!
    2,Assembly.LoadFrom()
    这个方法从指定的路径来加载程序集,实际上这个方法被调用的时候,CLR会打开这个文件,获取其中的程序集版本,语言文化,公钥标记等信息,把他们传递给 Load方法,接着,Load方法采用上面的策略来查找程序集。如果找到了程序集,会和LoadFrom方法中指定的路径做比较,如果路径相同,该程序集 会被认为是应用程序的一部分,如果路径不同或Load方法没有找到程序集,那该程序集只是被作为一个"数据文件"来加载,不会被认为是应用程序的一部分。 这就是在第1点中提到的Load方法比LoadFrom方法的执行效率高的原因。另外,由于可能把程序集作为"数据文件"来加载,所以使用 LoadFrom从不同路径加载相同程序集的时候会导致重复加载。当然这个方法会加载此程序集引用的其他程序集。
    3,Assembly.LoadFile()
    这个方法是从指定的文件来加载程序集,和上面方法的不同之处是这个方法不会加载此程序集引用的其他程序集!
    结论:一般大家应该优先选择Load方法来加载程序集,如果遇到需要使用LoadFrom方法的时候,最好改变设计而用Load方法来代替!
    另:Assembly.LoadFile 与 Assembly.LoadFrom的区别
    1、Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("abc.dll"),则载入abc.dll,假如abc.dll中引用了def.dll的话,def.dll并不会被载入。
    Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,def.dll也会被载入。
    2、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,比如abc.dll有两个版本(版本1在目录1下,版本2放在目录2下),程序一开始时载入了版本1,当使用Assembly.LoadFrom("2\\abc.dll")载入版本2时,不能载入,而是返回版本1.Assembly.LoadFile的话则不会做这样的检查,比如上面的例子换成Assembly.LoadFile的话,则能正确载入版本2.
    LoadFile:加载指定路径上的程序集文件的内容。LoadFrom: 根据程序集的文件名加载程序集文件的内容。
    区别:
    LoadFile 方法用来来加载和检查具有相同标识但位于不同路径中的程序集。但不会加载程序的依赖项。
    LoadFrom 不能用于加载标识相同但路径不同的程序集。

总结:

Assembly.Load()方法,Assembly.LoadFrom()方法,Assembly.LoadFile()方法的区别
在C#中,我们要使用反射,首先要搞清楚以下命名空间中几个类的关系:
    System.Reflection命名空间
    (1)   AppDomain:应用程序域,可以将其理解为一组程序集的逻辑容器
    (2)   Assembly:程序集类
    (3)   Module:模块类
    (4)   Type:使用反射得到类型信息的最核心的类
    他们之间是一种从属关系,也就是说,一个AppDomain可以包含N个Assembly,一个Assembly可以包含N个Module,而一个Module可以包含N个Type.

1,Assembly.Load()
    这个方法通过程序集的长名称(包括程序集名,版本信息,语言文化,公钥标记)来加载程序集的,会加载此程序集引用的其他程序集,一般情况下都应该优先使用 这个方法,他的执行效率比LoadFrom要高很多,而且不会造成重复加载的问题(原因在第2点上说明)
    使用这个方法的时候, CLR会应用一定的策略来查找程序集,实际上CLR按如下的顺序来定位程序集:
    ⑴如果程序集有强名称,在首先在全局程序集缓(GAC)中查找程序集。
    ⑵如果程序集的强名称没有正确指定或GAC中找不到,那么通过配置文件中的<codebase>元素指定的URL来查找
    ⑶如果没有指定强名称或是在GAC中找不到,CLR会探测特定的文件夹:
    假设你的应用程序目录是C:\AppDir,<probing>元素中的privatePath指定了一个路径Path1,你要定位的程序集是AssemblyName.dll则CLR将按照如下顺序定位程序集
    C:\AppDir\AssemblyName.dll
    C:\AppDir\AssemblyName\AssemblyName.dll
    C:\AppDir\Path1\AssemblyName.dll
    C:\AppDir\Path1\AssemblyName\AssemblyName.dll
    如果以上方法不能找到程序集,会发生编译错误,如果是动态加载程序集,会在运行时抛出异常!
    2,Assembly.LoadFrom()
    这个方法从指定的路径来加载程序集,实际上这个方法被调用的时候,CLR会打开这个文件,获取其中的程序集版本,语言文化,公钥标记等信息,把他们传递给 Load方法,接着,Load方法采用上面的策略来查找程序集。如果找到了程序集,会和LoadFrom方法中指定的路径做比较,如果路径相同,该程序集 会被认为是应用程序的一部分,如果路径不同或Load方法没有找到程序集,那该程序集只是被作为一个"数据文件"来加载,不会被认为是应用程序的一部分。 这就是在第1点中提到的Load方法比LoadFrom方法的执行效率高的原因。另外,由于可能把程序集作为"数据文件"来加载,所以使用 LoadFrom从不同路径加载相同程序集的时候会导致重复加载。当然这个方法会加载此程序集引用的其他程序集。
    3,Assembly.LoadFile()
    这个方法是从指定的文件来加载程序集,和上面方法的不同之处是这个方法不会加载此程序集引用的其他程序集!
    结论:一般大家应该优先选择Load方法来加载程序集,如果遇到需要使用LoadFrom方法的时候,最好改变设计而用Load方法来代替!
    另:Assembly.LoadFile 与 Assembly.LoadFrom的区别
    1、Assembly.LoadFile只载入相应的dll文件,比如Assembly.LoadFile("abc.dll"),则载入abc.dll,假如abc.dll中引用了def.dll的话,def.dll并不会被载入。
    Assembly.LoadFrom则不一样,它会载入dll文件及其引用的其他dll,比如上面的例子,def.dll也会被载入。
    2、用Assembly.LoadFrom载入一个Assembly时,会先检查前面是否已经载入过相同名字的Assembly,比如abc.dll有两个版本(版本1在目录1下,版本2放在目录2下),程序一开始时载入了版本1,当使用Assembly.LoadFrom("2\\abc.dll")载入版本2时,不能载入,而是返回版本1.Assembly.LoadFile的话则不会做这样的检查,比如上面的例子换成Assembly.LoadFile的话,则能正确载入版本2.
    LoadFile:加载指定路径上的程序集文件的内容。LoadFrom: 根据程序集的文件名加载程序集文件的内容。
    区别:
    LoadFile 方法用来来加载和检查具有相同标识但位于不同路径中的程序集。但不会加载程序的依赖项。
    LoadFrom 不能用于加载标识相同但路径不同的程序集。

转自:http://blog.csdn.net/lyncai/article/details/8621880

C#反射Assembly 详细说明的更多相关文章

  1. C#反射Assembly 详细说明,有项目例子

    1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等 ...

  2. C#反射Assembly 详细说明(转)

    1.对C#反射机制的理解2.概念理解后,必须找到方法去完成,给出管理的主要语法3.最终给出实用的例子,反射出来dll中的方法 反射是一个程序集发现及运行的过程,通过反射可以得到*.exe或*.dll等 ...

  3. 关于反射Assembly.Load("程序集").CreateInstance("命名空间.类")

    关于反射Assembly.Load("程序集").CreateInstance("命名空间.类") 而不管在哪一层写这段代码其中的("程序集" ...

  4. [转]C#反射-Assembly.Load、LoadFrom与LoadFile进阶

    关于.NET中的反射,常用的有三个方法: Assembly.Load()Assembly.LoadFrom()Assembly.LoadFile() 下面说说这三个方法的区别和一些细节问题 1. As ...

  5. C#中的反射 Assembly.Load() Assembly.LoadFrom()

    一些关于C#反射的知识,估计也就最多达到使用API的程度,至于要深入了解,以现在的水平估计很难做到,所以下面此篇文章,以作为一个阶段的总结. 对于反射的总结,我想从以下几个方面展开,首先是反射程序集, ...

  6. C# 反射的详细理解

    网友A的解释: C# 反射机制的学习心得   首先说说,为什么要学习 反射 呢?有什么用啊. 在我们写程序的时候,经常会用到一些类中的方法,那么就要调用这些个类.如果不是在一个命名空间里时,就要引用相 ...

  7. C#反射Assembly 具体说明

    1.对C#反射机制的理解 2.概念理解后,必须找到方法去完毕,给出管理的主要语法 3.终于给出有用的样例,反射出来dll中的方法 反射是一个程序集发现及执行的过程,通过反射能够得到*.exe或*.dl ...

  8. C#反射-Assembly.Load、LoadFrom与LoadFile

    反射Demo: public class Person { public int Age; public void SayHello() { Console.WriteLine("Hello ...

  9. c#利用反射Assembly 对类和成员属性进行操作

    protected static void test() { //获取程序集 Assembly assembly = System.Reflection.Assembly.GetExecutingAs ...

随机推荐

  1. MVVMLight leaning note

    Learning Note For MvvmLight MvvmLight quitstart refer link1 : MVVMLight HelloWorld *** mc:Ignorable ...

  2. 如何设置电脑的IP

    先找到自己的ip,在设置ip. 图1 图2 图3 图4 图5 图6

  3. 12.Warning (15714): Some pins have incomplete I/O assignments. Refer to the I/O Assignment Warnings report for details

    解释:对于一些管脚,缺少了部分描述,需要再添加一些设置,比如current strength,slew rate等: 措施:打开pin plannel界面,在current strength和slew ...

  4. iTween基础之Color(变换颜色)

    一.基础介绍:二.基础属性 原文地址: http://blog.csdn.net/dingkun520wy/article/details/51065275 一.基础介绍 ColorTo:从当前颜色变 ...

  5. android 安装应用程序apk安装不了

    今天用测试机的时候遇到这个问题 解决办法: 在设置里面找到应用程序管理安全设置,,[允许未知来源程序安装] -------------大致以上思路,具体按钮名称我就不重新去找了------------ ...

  6. 阿里云无线&前端团队是如何基于webpack实现前端工程化的

    背景 前端经历了初期的野蛮生长(切图,写简单的特效)——为了兼容浏览器兼容性而出现的各种类库(JQUERY,YUI等——mv*(饱暖思淫欲,代码多了,也就想到怎样组织代码结构,backbone,ang ...

  7. Weblogic环境下hibernate、antlr类加载冲突问题分析及解决方案

    公司应用项目在客户部署时经常遇到此类问题,为避免实施部署时增加配置量,花了点时间找到了此问题的终极解决办法(方案二.修改org.hibernate.hql.ast.HqlLexer的源代码).在此进行 ...

  8. maven插件:tomcat插件和jetty插件的区别

    在程序是多模块结构的时候,使用tomcat的maven插件和jetty的maven插件有细微差别: 1.tomcat7-maven-plugin   可以直接在parent的邮件直接运行:tomcat ...

  9. hdu 4003 Find Metal Mineral 树形DP

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4003 Humans have discovered a kind of new metal miner ...

  10. shader 汇编

    mad ro.xy v1.xyxx, l(1.000000,-1.000000,0.0000,0.000000), l(0.000000,1.000000,0.0000,0.000000) 这个东西真 ...