反射

1.反射:反射式一个运行库类型发现的过程,通过反射,可以得到一个给定程序集所包含的所有类型的列表

(1)System.Type

       System.Type,该类是一个抽象类,该类定义了大量成员,可以用来检查一个类型的元数据,从System.Reflection命名空间返回的类型非常多。Type.GetMethods()返回一个MethodInfo类型的数组,Type.GetFields()返回一个FieldInfo类型那个的数组。

如何得到Type引用:

    System.Object.GetType():

          SportsCar sc=new Sportscar();

                    Type  t=sc.GetType();

        System.Type.GetType():

                     Type t=Type.GetType(“CarLibrary.SportsCar”)

Typeof():

             Type t=typeof(SportsCar);

2.用反射方法构建自定义的元数据查看器:

    class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("*****Welcome to MyTypeViewer*****");

            string typeName = "";

            bool userIsDone = false;

 

            do

            {

                Console.WriteLine("/nEnter a type name to ecaluate");

                Console.WriteLine("or enter Q to quit");

 

                typeName = Console.ReadLine();

 

                if (typeName.ToUpper() == "Q")

                {

                    userIsDone = true;

                    break;

                }

                try

                {

                    Type t = Type.GetType(typeName);

                    Console.WriteLine();

                    ListVariousStats(t);

                    ListProps(t);

                    ListMethods(t);

                   }

                catch

                {

                    Console.WriteLine("Sorry,can't find type");

                }

            }

            while (!userIsDone);

        }

 

        static void ListMethods(Type t)

        {

            Console.WriteLine("*****Method*****");

            MethodInfo[] mi = t.GetMethods();

            foreach (MethodInfo m in mi)

                Console.WriteLine("->{0}", m.Name);

            Console.WriteLine();

        }

 

        static void ListProps(Type t)

        {

            Console.WriteLine("*****Properties*****");

            PropertyInfo[] pi = t.GetProperties();

            foreach (PropertyInfo p in pi)

                Console.WriteLine("->{0}", p.Name);

            Console.WriteLine();

        }

 

        static void ListVariousStats(Type t)

        {

            Console.WriteLine("*****Various Statistics*****");

            Console.WriteLine("Base class is:{0}", t.BaseType);

            Console.WriteLine("Is type abstract?{0}", t.IsAbstract);

            Console.WriteLine("Is type sealed?{0}", t.IsSealed);

            Console.WriteLine("Is type generic?{0}", t.IsGenericParameter);

            Console.WriteLine("Is type a class type?{0}", t.IsClass);

            Console.WriteLine();

        }

    }

}

3.动态加载程序集:

   System.Reflection定义了一个名为Assembly的类,可以动态加载程序集,并找到关于程序集自身的属性,还可以动态加载私有或恭喜那个程序集,还能够加载任意位置的程序集。

4.晚期绑定:简单地说,晚期绑定时一种创建一个给定类型的实例并在运行时调用其成员,而不需要在编译时知道它存在的一种技术。

     Activator.CreateInstance()方法是用来建立一个晚期绑定类型的实例:

class Program

    {

        static void Main(string[] args)

        {

            Console.WriteLine("*****Fun with Late Binding*****");

            Assembly a = null;

            try

            {

                a = Assembly.Load("CarLibrary");

            }

            catch (FileNotFoundException e)

            {

                Console.WriteLine(e.Message);

                return;

            }

            Type miniVan = a.GetType("CarLibrary.Car+MiniVan");

 

            object obj = Activator.CreateInstance(miniVan);

            Console.WriteLine("Created a {0} using late bingding!", obj);

            MethodInfo mi = miniVan.GetMethod("TurboBoost");

            mi.Invoke(obj, null);

            Console.ReadLine();

        }

}

反射、晚期绑定和自定义特性的使用背景:

   首先,可扩展的应用程序必须提供一些输入手段允许用户指定被插入的模块(比如一个对话框或命令标志)。这需要动态加载;

   其次,为了插入到环境中,可扩展的应用程序必须要确定模块是否支持正确的功能(比如一组需要的接口),这需要反射;

   最后,可扩展的应用程序必须获取一个需要的基础架构的引用(例如接口类型)并调用成员处罚底层功能。这需要晚期绑定。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值