关闭

C#反射的体会

441人阅读 评论(0) 收藏 举报

1 反射说明

        反射(Reflection)是.net中的重要机制,通过反射,可以在运行时获得.net中的每一个类型(包括类、结构、委托、接口和枚举等)的成员,包括方法、属性、事件、以及构造函数等。还可以获得每个成员的名称、限定符和参数等。有个反射,如果获得了构造函数的信息,即可以直接创建对象,即使这个对象的类型在编译时还不知道。
1.1 .net可执行应用程序结构
        程序带在编译后生成可执行的应用,我们首先要了解这种可执行应用程序的结构。应用程序结构分为“应用程序域--程序集--模块--类型--成员”几个层次,公共语言运行库加载器管理成用程序域,这种管理包括将每个程序集加载到相应的应用程序域以及控制每个程序几种类型层次结构的内存布局。
       程序集包括模块,而模块包含类型,类型有包含成员,反射则提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型帮定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射通常具有以下用途: 
      a 使用Assembly定义和加载程序集,加载在程序集清单中列出模块,以及从此程序集中查找类型并创建该类型的实例。
      b 使用Module了解包含模块的程序集以及模块中的类等,还可以获取从模块上定义的所有全局方法或其他特定的非全局方法。
      3 使用 ConstructorInfo 了解构造函数的名称、参数、访问修饰符(如public 或private)和实现向信息(如abstract或virtual)等。使用Type的GetContructors或GetConstructor方法来调用特定的构造函数 。
      c使用MethodInfo了解方法的名称,返回类型、参数、访问修饰符(如public 或private)和实现向信息(如abstract或virtual)等。使用Type的GetMethods或GetMethod方法来调用特定的方法 。
      d 使用FieldInfo了解字段的名称,访问修饰符(如public 或private)和实现详细信息(如Static)等,并获取或设置字段值 。
      e 使用EventInfo了解事件的名称、事件处理程序数据类型、自定义属性、声明类型和反射类型等,添加或移除事件处理程序。
      f 使用PropertyInfo了解属性的名称、数据类型、声明类型、反射类型和只读或可写状态等,获取或设置属性值。
      g  使用ParameterInfo了解参数的名称、数据类型、是输入参数还是输出参数,以及参数在方法签名中的设置等。
      System.Relection.Emit命名空间的类提供了一种特殊形式的反射,可以在运行时构造类型。
      反射也可用于创建成为类型浏览器的应用程序,使用户能够选择类型,然后查看有关选定类型的信息。
      此外,JScript等语言比嗄伊奇使用反射来构造符号表。System.Runtime.remoting命名空间中的类通过序列化来间接地使用反射。 

2 代码说明

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Globalization;
using NetBpm.Util.Client;
using System.Reflection;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            Assembly a = Assembly.LoadFrom("D://netbpm-0.8.8.1//netbpm-0.8.8.1//bin//NetBpm.Example.dll");
            Type[] mytypes = a.GetTypes();
            foreach (Type t in mytypes)
            {
                System.Console.WriteLine(t.Name);
            }
            System.Console.WriteLine("----------------");
            //
            Type ht = typeof(C1);
            MethodInfo[] mif = ht.GetMethods();
            foreach (MethodInfo mf in mif)
            {
                System.Console.WriteLine(mf.ToString());
            }
            System.Console.WriteLine("----------------");
            //

            //这里加载的一   System.Object   所在的程序集,你也可以指定其它  
            System.Reflection.Assembly assembly = typeof(C1).Assembly;
            Type[] types = assembly.GetTypes();

            Console.WriteLine(types.Length.ToString());

            foreach (Type type in types)
            {
                //仅   System   命名空间的限制  
               
                //if (type.Namespace == null || type.Namespace != "System")
                //{
                //    continue;
                //}

                //if (type.IsEnum)
                //{
                //    //列出枚举类型中的所有值  
                //    Array vals = Enum.GetValues(type);
                //    foreach (object val in vals)
                //    {
                //        Console.WriteLine("Type:   {0}   -->   {1}", type, val);
                //    }
                //}
                if (type.IsClass)
                {
                    //必须加上命名空间
                    if (type.ToString() == "ConsoleApplication1.C1")
                    {
                        object obj = Activator.CreateInstance(type);
                        BindingFlags flags = (BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly);
                        MethodInfo DoPrint = type.GetMethod("Print");
                        DoPrint.Invoke(obj, null);

                        //object obj1 = Activator.CreateInstance(type);
                        //string[] s ={ "Hello,Teddy" };
                        //MethodInfo DoPrint1 = type.GetMethod("Void Print(System.String)");
                        //DoPrint1.Invoke(obj, s);
                    }
                }
            }
            Console.Read();
        }
       
    }

    interface I1
    {
        string Print();
    }
    class C1:I1
    {
        public string s;
        public string Print()
        {
            System.Console.WriteLine("This Is From C1");
            return "";
        }
        //public void Print(string str1)
        //{
        //    System.Console.WriteLine(str1);
        //}
    }
    class C2 : C1 {
   
    }
   
}
执行结果:

HelloWorldAction
HolidayProcessInvoker
OvertakingAction
ScheduleOvertakingAction
SchedulingSample1AuthorizationHandler
TrivialAssignmentHandler
----------------
System.String Print()
System.Type GetType()
System.String ToString()
Boolean Equals(System.Object)
Int32 GetHashCode()
----------------
4
This Is From C1

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:41118次
    • 积分:852
    • 等级:
    • 排名:千里之外
    • 原创:41篇
    • 转载:9篇
    • 译文:0篇
    • 评论:10条
    文章分类
    最新评论