反射的描述是这样的:
反射提供了封装程序集、模块和类型的对象。我们可以使用反射动态地创建类型的实例,将类型绑定到现有对象或从现有对象中获取类型,然后调用类型的方法或访问其字段和属性。反射:不就是在对象中加载程序集,同时访问程序集中的类型和方法吗?怎么还“动态地创建类型的实例”,这个动态,怎样理解,和直接初始化对象有什么不同吗?为什么起名叫反射,怎样理解这两个字,就是在程序中加载其它程序集直接在程序中添加程序集的引用不也一样吗???有点理解不了,迷糊???

解决方案 »

  1.   

    所谓动态,当然是个静态相对...你“直接在程序中添加程序集的引用”就是静态引用,这些程序集就成了程序的依赖项,缺少这些程序集你的程序跑都跑不起来...至于为什么叫反射呢,英文是reflection,实际上是映象、反映的意思...就是通过对象的元数据来创建对象...反射不是“在程序中加载其它程序集”,“在程序中加载其它程序集”只是为反射做准备工作,也不是必须的...由对象的元数据来创建对象才是反射,因此静态加载的程序集也可以做反射...反射需要每次都读取对象的元数据来创建对象,所以效率较低...加上通常还要临时加载程序集,导致效率更低...但是这会带来更大的灵活性和静态加载无法实现的一些想法...所以动态加载程序集和反射很有用,但不能滥用...
      

  2.   

    有时候你不知道你要使用的程序集,或者不知道要使用的类是哪个类,就要用反射
    举个例子,比如说要做个插件,怎么做
    主程序里要定义个接口公布出来,插件程序实现这个接口,把插件程序集放到指定目录
    主程序就需要用反射把各个插件的dll加载进来,然后转换成接口并调用
      

  3.   

    举个例子:接口IA,有两个实现类A,B
    IA a = new A();  这样的代码一旦编译成为dll,除非改代码,否则a永远是A的实例。
    但如果用反射,我们可以:
    IA a = (IA)Activator.CreateInstance("B");即创建实例的地方变成字符串,这个字符串又可以通过种种方式拿到程序外部,
    比如:配置文件,数据库,用户输入。
    这样 a 就有可能不需要修改代码,重新编译就可以指向不同的实例。
      

  4.   

    随便举个反射应用的例子,比如你在vs编程时,如果在工具箱装入一个控件,然后编辑设计窗口(页面)上的控件实例时,vs就会在属性窗口动态产生编辑界面,也能够知道控件支持哪些事件。人家做vs的时候又不依赖各种控件,不依赖你写的控件(根本不存在“直接在程序中添加程序集的引用”这一说),可是人家vs还是可以使用这些控件来辅助你进行设计。
      

  5.   

    反射主要用在一些设计模式里面吧,就是把别人的dll重新弄过来可以动态生成一些类
      

  6.   

    我的意思是反射对于设计模式的实现有很大帮助,比如想用工厂模式就可以通过反射来实现部分代码,或是可以把需要反射的dll名写在数据库里动态生成dll里面定义的类,这种理解有错误码?
      

  7.   

    命名空间好比是人的民族,有汉族、回族等。程序集好比是地址,比如北京、上海、成都、重庆人好比是一个一个的类,可以是汉族,也可以是回族,可以住在北京,也可以住在上海。这个类住在哪里,属于哪个程序集,这就需要元数据来进行描述,否则程序运行时不通过元数据就找不到对应的类而从一个程序集中访问另个程序集,可以通过“Using”静态添加,这是会产生依赖项。但是,如果要做一些插件为程序做扩展,就需要动态的添加程序集,可以设置配置文件,从中读取信息,这是就要用到反射。反射,访问元数据,建立程序集对象,返回类型,实例化类型但是,由于是访问元数据,所以资源开销比较大,要谨慎使用子夜,答得还行吧
      

  8.   

    下面给一段使用反射的实际代码:/// <summary>
            /// 创建指定类型(接口,抽象类)的实例
            /// </summary>
            /// <typeparam name="T">指定类型(接口,抽象类)</typeparam>
            /// <param name="providerAssembly">提供程序的程序集名称</param>
            /// <param name="providerType">类型的完整名称</param>
            /// <returns></returns>
            public T CreateInstance<T>(string providerAssembly, string providerType)
            {
                Assembly assembly = Assembly.Load(providerAssembly);
                object provider = assembly.CreateInstance(providerType);            if (provider is T)
                {
                    return (T)provider;
                }
                else
                {
                    throw new InvalidOperationException("当前指定的的提供程序不是当前类型具体实现类");
                }
            }
    PDF.NET数据开发框架可以通过反射创建具体的数据访问对象,比如新增一个Sysbase数据库,只要继承了系统的抽象数据访问接口,使用反射,系统就有了访问Sysbase数据库的能力了。
      

  9.   

    什么叫 "using" 静态添加