C#反射机制学习总结 .

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

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

[csharp] view plaincopyprint?

  1. System.Reflection.Assembly
  2. System.Reflection.MemberInfo
  3. System.Reflection.EventInfo
  4. System.Reflection.FieldInfo
  5. System.Reflection.MethodBase
  6. System.Reflection.ConstructorInfo
  7. System.Reflection.MethodInfo
  8. System.Reflection.PropertyInfo
  9. System.Type
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了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的位置等。

 反射的层次模型:

void Main

  • {
  • //通过GetAssemblies 调用appDomain的所有程序集
  • foreach (Assembly assem in Appdomain.currentDomain.GetAssemblies())
  • {
  • //反射当前程序集的信息
  • reflector.ReflectOnAssembly(assem)
  • }
  • }
static void Main
{
       //通过GetAssemblies 调用appDomain的所有程序集
       foreach (Assembly assem in Appdomain.currentDomain.GetAssemblies())
      {
       //反射当前程序集的信息
            reflector.ReflectOnAssembly(assem)
      }
}

说明:调用AppDomain 对象的GetAssemblies 方法 将返回一个由System.Reflection.Assembly元素组成的数组。

[csharp] view plaincopyprint?

  1. using system;
  2. using sytem.reflection;
  3. class reflecting
  4. {
  5. static void Main(string[]args)
  6. {
  7. reflecting reflect=new reflecting();//定义一个新的自身类
  8. //调用一个reflecting.exe程序集
  9. assembly myAssembly =assembly.loadfrom(“reflecting.exe”)
  10. reflect.getreflectioninfo(myAssembly);//获取反射信息
  11. }
  12. //定义一个获取反射内容的方法
  13. void getreflectioninfo(assembly myassembly)
  14. {
  15. type[] typearr=myassemby.Gettypes();//获取类型
  16. foreach (type type in typearr)//针对每个类型获取详细信息
  17. {
  18. //获取类型的结构信息
  19. constructorinfo[] myconstructors=type.GetConstructors;
  20. //获取类型的字段信息
  21. fieldinfo[] myfields=type.GetFiedls()
  22. //获取方法信息
  23. MethodInfo   myMethodInfo=type.GetMethods();
  24. //获取属性信息
  25. propertyInfo[] myproperties=type.GetProperties
  26. //获取事件信息
  27. EventInfo[] Myevents=type.GetEvents;
  28. }
  29. }
  30. }
using system;
using sytem.reflection;
class reflecting
{
       static void Main(string[]args)
       {
             reflecting reflect=new reflecting();//定义一个新的自身类
             //调用一个reflecting.exe程序集

             assembly myAssembly =assembly.loadfrom(“reflecting.exe”)
             reflect.getreflectioninfo(myAssembly);//获取反射信息
       }

       //定义一个获取反射内容的方法
       void getreflectioninfo(assembly myassembly)
       {
             type[] typearr=myassemby.Gettypes();//获取类型
             foreach (type type in typearr)//针对每个类型获取详细信息
            {
                   //获取类型的结构信息
                  constructorinfo[] myconstructors=type.GetConstructors;

                 //获取类型的字段信息
                 fieldinfo[] myfields=type.GetFiedls()

                 //获取方法信息
                 MethodInfo   myMethodInfo=type.GetMethods();

                 //获取属性信息
                 propertyInfo[] myproperties=type.GetProperties

                 //获取事件信息
                 EventInfo[] Myevents=type.GetEvents;
           }
      }
}

其它几种获取type对象的方法:
1、System.type   参数为字符串类型,该字符串必须指定类型的完整名称(包括其命名空间)
2、System.type 提供了两个实例方法:GetNestedType,GetNestedTypes
3、Syetem.Reflection.Assembly 类型提供的实例方法是:GetType,GetTypes,GetExporedTypes
4、System.Reflection.Moudle 提供了这些实例方法:GetType,GetTypes,FindTypes

设置反射类型的成员:
反射类型的成员就是反射层次模型中最下面的一层数据。我们可以通过type对象的GetMembers 方法取得一个类型的成员。如果我们使用的是不带参数的GetMembers,它只返回该类型的公共定义的静态变量和实例成员,我们也可以通过使用带参数的 GetMembers通过参数设置来返回指定的类型成员。具体参数参考msdn 中system.reflection.bindingflags 枚举类型的详细说明。

例如:

[csharp] view plaincopyprint?

  1. //设置需要返回的类型的成员内容
  2. bindingFlags bf=bingdingFlags.DeclaredOnly|bingdingFlags.Nonpublic|BingdingFlags.Public;
  3. foreach (MemberInfo mi int t.getmembers(bf))
  4. {
  5. writeline(mi.membertype)    //输出指定的类型成员
  6. }
//设置需要返回的类型的成员内容
bindingFlags bf=bingdingFlags.DeclaredOnly|bingdingFlags.Nonpublic|BingdingFlags.Public;
foreach (MemberInfo mi int t.getmembers(bf))
{
       writeline(mi.membertype)    //输出指定的类型成员
}

[csharp] view plaincopyprint?

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using System.Text.RegularExpressions;
  5. using System.Web.UI;
  6. using System.Collections;
  7. namespace cn.SwordYang
  8. {
  9. public class TextClass:System.Web.UI.Page
  10. {
  11. public static void RunJs(Page _page, string Source)
  12. {
  13. _page.ClientScript.RegisterStartupScript(_page.GetType(), "", "<script type=\"text/javascript\">" + Source + ";</script>");
  14. }
  15. }
  16. }
  17. //调用代码
  18. System.Reflection.Assembly ass = Assembly.LoadFrom(Server.MapPath("bin/swordyang.dll")); //加载DLL
  19. System.Type t = ass.GetType("cn.SwordYang.TextClass");//获得类型
  20. object o = System.Activator.CreateInstance(t);//创建实例
  21. System.Reflection.MethodInfo mi = t.GetMethod("RunJs");//获得方法
  22. mi.Invoke(o, new object[] { this.Page,"alert(‘测试反射机制‘)"});//调用方法
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using System.Web.UI;
using System.Collections;
namespace cn.SwordYang
{
    public class TextClass:System.Web.UI.Page
    {
public static void RunJs(Page _page, string Source)
        {
            _page.ClientScript.RegisterStartupScript(_page.GetType(), "", "<script type=\"text/javascript\">" + Source + ";</script>");
        }
}
}
//调用代码
System.Reflection.Assembly ass = Assembly.LoadFrom(Server.MapPath("bin/swordyang.dll")); //加载DLL
            System.Type t = ass.GetType("cn.SwordYang.TextClass");//获得类型
            object o = System.Activator.CreateInstance(t);//创建实例
            System.Reflection.MethodInfo mi = t.GetMethod("RunJs");//获得方法
            mi.Invoke(o, new object[] { this.Page,"alert(‘测试反射机制‘)"});//调用方法

反射机制对应设计模式中的策略模式。

C#反射机制学习总结 .

时间: 2024-11-05 19:25:53

C#反射机制学习总结 .的相关文章

JAVA反射机制—学习总结

最近收到很多关于Java反射机制的问题留言,其实Java反射机制技术方面没有太多难点,或许是大家在学习过程中遗漏了细小知识点,导致一些问题无法彻底理解,现在我们简单的总结一下,加深印象. 什么是反射机制? "JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意方法和属性:这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制."我们通过一些例子,更好理解反射机制.Class类 我们知道Java是一门面向对象

JAVA的反射机制学习笔记(二)

上次写JAVA的反射机制学习笔记(一)的时候,还是7月22号,这些天就瞎忙活了,自己的步伐完全被打乱了~不能继续被动下去,得重新找到自己的节奏. 4.获取类的Constructor 通过反射机制得到某个类的构造器,然后调用该构造器创建该类的一个实例 Class<T>类提供了几个方法获取类的构造器. public Constructor<T> getConstructor(Class<?>... parameterTypes) 返回一个 Constructor 对象,它反

java反射机制学习小结

之前一直对java的反射机制理解得很模糊,今天因为学习spring,所以花了些时间总算把它理顺了,记录一下 另外,推荐读读这篇文章,写的挺好的http://blog.csdn.net/woshixuye/article/details/7700455 class Person { private String name; private int age; // public Person(String name,int age){ // this.name=name; // this.age=a

java反射机制学习:初始反射机制

本人小白一枚,想和大家一起分享我学习java的笔记和心得. 反射机制: 指的是可以于运行时加载.探知.使用编译期间完全未知的类. 程序在运行状态中,可以动态加载一个只有名称的类,对于任意一个已加载的类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性: Class clazz = Class.forName(com.danchel.reflect.User); 加载完类之后,在堆内存中,就产生了一个Class类型的对象(一个类只有一个Class对象),这个对象

黑马程序员---Java反射机制学习

由现在这个时间补上反射机制的学习笔记,本想报20期的JavaEE班,无奈真担心自己过不去,所以这段时间,一直的复习现在改报21期的吧!! 准备知识:一 1.Java的反射机制的实现要借助于4个类:class,Constructor,Field,Method:    其中class代表的时类对象,    Constructor-类的构造器对象,    Field-类的属性对象,    Method-类的方法对象. 2.在Java中,每个class都有一个相应的Class对象.也就是说,当我们编写一

Thinking in Java---类型信息和java反射机制学习笔记

前面学习的多态给了我们一个很好的承诺:我们编写的代码只要与基类打交道,而不用为每一个新增加的子类写一份代码.但是这种思想在我们想要访问子类自己定义的方法时,就会有问题了.如下面的代码所示: class Base1{ void f(){ System.out.println("Base.f()"); } } class Sub extends Base1{ void f(){ System.out.println("Sub.f()"); } void g(){ Sys

php反射机制学习

PHP 5 具有完整的反射 API,可以通过反射机制来获取类,接口,函数的详细信息.例如可以通过反射api的成员属性,成员方法,命名空间的名称,检测某个类是否为抽象类等操作.(欢迎指点) 一般用途是在框架中配合自动加载类来完成 对类的实例化操作. 1.建立一个Person类的反射类,然后实例化此类. <?php class Person { /** * demo */ private $_allowDynamicAttributes = false; /** demo*/ public $id

JAVA反射机制学习随笔

JAVA反射机制是用于在运行时动态的获取类的信息或者方法,属性,也可以用来动态的生成类,由于所有类都是CLASS的子类,我们可以用一个CLASS类的实例来实例化各种类 例如: Class<?> class1 = null; Class<?> class2 = null; //写法1, 可能抛出 ClassNotFoundException [多用这个写法] class1 = Class.forName("cn.lee.demo.Person"); System.

Java反射机制学习

Java 反射是Java语言的一个很重要的特征,它使得Java具体了“动态性”. 在Java运行时环境中,对于任意一个类,能否知道这个类有哪些属性和方法?对于任意一个对象,能否调用它的任意一个方法?答案是肯定的.这种动态获取类的信息以及动态调用对象的方法的功能来自于Java 语言的反射(Reflection)机制. Java 反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类. 在运行时构造任意一个类的对象. 在运行时判断任意一个类所具有的成员变量和方法. 在运行时调用任意一个对象的