天天看点

C# 程序集 和 反射

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

.Net 反射机制主要提供了以下功能:

a.在程序运行时:动态 获取加载程序集; 动态获取类型(如类、接口等); 动态获取类型的成员信息(如方法,字段,属性等);

b.在运行时,动态创建(主要根据类名 或成员名 字符串动态创建)类型实例,以及 调用和 访问 这些 实例 成员;

1.反射-Assembly 程序集对象    using System.Reflection;

    Assembly 类 表示 某个程序集 ( . dll /exe )

    获取程序集的方式:

       获得当前程序域中 所有的Assembly:AppDomain.CurrentDomain.GetAssemblies()

       获取当前 对象所在的Assembly:this.GetType().Assembly

       根据路径加载Assembly :Assembly.LoadFrom(assPath)

2.反射- Type 类型对象

    Type类,程序运行时一个class对应一个Type类的对象。通过Type对象可以获得类的所有的定义信息,比如类有哪些属性、哪些方法等。

     获得 Type 对象的方式:  1,2为获得单个类型对象,3,4,5 通过程序集获取Type

        1.通过类 获得对应Type:Typet =typeof(Person)

        2.通过对象获得 Type:Typet =p.GetType()

        3.根据类的全名称获取程序集中定义的类:Type  type=Assembly.GetType("BLL.Person")

       4.获取程序集中定义的所有的public类:Type[] types =assembly.GetExportedTypes()

       5.获取程序集中定义的所有的类型:Type[] types =assembly.GetTypes()

      反射- Type 的成员

         属性:

                • type.Assembly :获取 type 所在的程序集对象                 • type.FullName :获取 type 对象对应的类的全名称                 • type.Name : 获取 type 对象对应类的 名称                 • type.IsArray :    判断 type 是否为一个数组类                 • type.IsEnum :   判断 type 是否为一个枚举类           方法:                  • type.IsAssignableFrom(Type i) :判断 type 是否实现了接口 i                  • type.IsSubclassOf(Type father) :判断 type 是否继承了 father                  • type.IsInstanceOfType(object o ) :判断 o 是否为 type 类的实例                   • type.GetFiled("gender") :获取 type 中名为 gender 的字段 对象                  • type.GetMethod("SayHi") :获取 type 中名为 SayHi 的方法对象                  • type.GetProperty("Age") :获取 type 中名为 Age 的属性对象

3.反射-FiledInfo字段对象

      FiledInfo类代表某个类中的一个成员字段(类的全局变量)

      例:操作对象的字段

      publicclassDog

      {

              publicstringdogName;

              publicintdogAge;

      }   

     Dog dObj =newDog(){dogName="小花",dogAge=1 };

     Type dType =dObj.GetType();

      FiledInfo fiDN =dType.GetFiled("dogName");//获取字段对象

      string  strName =fiDN.GetValue(dObj);//获取dObj的dogName字段值

       fiDN.SetValue(dObj,"小白");//设置dObj里的dogName字段值

4.反射-PropertyInfo属性对象

   Property Info 类代表某个类中的一个属性

    例:操作 对象 的属性

   publicclassDog

   {

        publicstringName{get;set;}

        publicintAge{get;set;}

   }

   Dog dObj =newDog(){Name="小花",Age=1};

   Type dType =dObj.GetType();

   PropertyInfo piN=dType.GetProperty("Name");//获取属性对象

   string strName =piN.GetValue(dObj);//获取dObj的Name属性值

    piN.SetValue(dObj,"小白");//设置dObj里的Name属性值

5.反射-MethodInfo方法对象

    MethodInfo 类 代表某个类中的一个方法    

   publicclassDog

   {

        publicstringSmile(string name)

       {

             return "一只会笑的狗:"+name;

       }

    }

    Dog  dObj =newDog();

    Type  dType =dObj.GetType();

    MethodInfo  method=dType.GetMethod("Smile");   //获取方法对象

    object  res1 = dObj.Smile("哇哈哈~~");   //*普通调用方法

    object res2= method.Invoke(dObj,newobject[]{"小白"});   //*反射调用dObj的Smile方法

6.反射- 动态创建对象

1.objectres = Activator.CreateInstance(Typetype)

    会动态调用类的 无参构造函数 创建一个对象 ,返回 值就是创建的对象,如果类没有无参构造函数就会报错 。

2.使用构造器创建 

publicclass Dog{  

      public Dog(stringname,intage){//构造函数代码... }

}

Type dType =typeof(Dog);//获取Dog类类型 对象

//获取构造器 对象(根据 参数列表的 参数类型 数组 获取)

ConstructorInfo cotr = dType. GetConstructor (new Type[]{ typeof (string), typeof ( int )} ); object resValue = cotr.Invoke (newobject[]{" 小白 ",2}); // 调用 dObj 的 Smile 方法

7.反射 - 调用对象私有成员

Person  p1 = new Person();

Type  type = p1.GetType();

//BindingFlags.Instance表示是实例方法,也就是不是static方法

MethodInfom Haha = type.GetMethod("Haha", BindingFlags.NonPublic | BindingFlags.Instance);

mHaha.Invoke(p1,null);

C# 程序集 和 反射
C# 程序集 和 反射
C# 程序集 和 反射