zoukankan      html  css  js  c++  java
  • 反射-学习笔记1

    1. 反射的原理

        反射是由框架提供的一个类库,可以访问dll中的metadata,动态获取dll的信息,并使用它。

    2. 反射+简单工厂+可配置

       反射三步曲: a. 动态加载dll

                            b. 获取类型信息

                            c. 创建对象

       看代码:

       先声明了一个接口DB.Interface 和一个类DB.MySql

    namespace DB.Interface
    {
        public interface IDBHelper  //定义一个连接数据库的接口
        {
            void Query();
        }
    }
    namespace DB.MySql
    {
        public class MySqlHelper:IDBHelper
        {
            public MySqlHelper()
            {
                Console.WriteLine("{0}被构造", this.GetType().Name);
            }
            public void Query()
            {
                Console.WriteLine("{0}.Query", this.GetType().Name);
            }
        }
    }

    配置文件中加<appSetting>字段

    <?xml version="1.0" encoding="utf-8" ?>
    <configuration>
        <startup> 
            <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5.2" />
        </startup>
      <appSettings>
        <!--<add key="IDBHelperType" value="DB.SqlServer,DB.SqlServer.SqlSeverHelper"/>-->
        <add key="IDBHelperType" value="DB.MySql,DB.MySql.MySqlHelper"/>
    </appSettings>
    </configuration>

     

    创建一个简单工厂

    public  class ObjectFactory   //简单工厂,创建对象
    {
        private static string IDBHelperType = ConfigurationManager.AppSettings["IDBHelperType"]; //用key来获取value字符串
        private static string DllName = IDBHelperType.Split(',')[0];
        private static string TypeName = IDBHelperType.Split(',')[1];
    
        public static IDBHelper CreateInstance()
        {
            Assembly assembly = Assembly.Load(DllName);// 1. 动态加载dll,参数为dll的名称,没有后缀
            Type type = assembly.GetType(TypeName);//2.获取类型信息,传递完整类型名称,namespace+classname
            object oObject = Activator.CreateInstance(type);//3.创建对象
            return (IDBHelper)oObject;
         }
     }

    主程序

     {
          Console.WriteLine("*********************reflection config************************");
          IDBHelper Helper = ObjectFactory.CreateInstance();
          Helper.Query();
     }

    3. 反射的有缺点:

        优点: 动态

        缺点: 代码麻烦;避开编译器的检查;耗性能

        反射的性能可以优化,下面给了一段测试反射性能的代码,并给出结果。

        

      {
             Console.WriteLine("*********************Monitor************************");                  
             long commonTime = 0;
             long reflectionTime = 0;
             {
                   Stopwatch watch = new Stopwatch();
                   watch.Start();
                   for(int i=0;i<1000000;i++)
                   {
                        IDBHelper Helper = new SqlSeverHelper();
                        Helper.Query();
                   }
                   watch.Stop();
                   commonTime = watch.ElapsedMilliseconds;
              }
              {
                   Stopwatch watch = new Stopwatch();
                   watch.Start();
                   Assembly assembly = Assembly.Load("DB.SqlServer");// 1. 动态加载dll,参数为dll的名称,没有后缀 
                   Type type = assembly.GetType("DB.SqlServer.SqlSeverHelper");//2.获取类型信息,传递完整类型名称,namespace+classname
                   for (int i = 0; i < 1000000; i++)
                   {                         
                         object oObject = Activator.CreateInstance(type);//3.创建对象                                     
                         ((IDBHelper)oObject).Query();//4.调用方法   
                   }
                   watch.Stop();
                   reflectionTime = watch.ElapsedMilliseconds;
               }
                        Console.WriteLine("commonTime={0}  reflectionTime={1}", commonTime, reflectionTime);
        }

    运行结果

     

  • 相关阅读:
    mysql ndb笔记
    oracle asmlib下载地址
    mysqldump
    mysqlsrlib
    AFDownloadRequestOperation
    [iphone]Code Sign error: Provisioning profile XXXX can"t be found
    cocos2d粒子效果
    如何以最好的方式实现游戏关卡
    关于autorelease pool一个较好的理解
    cocos2d场景转换的方法执行顺序
  • 原文地址:https://www.cnblogs.com/xiao9426926/p/6108877.html
Copyright © 2011-2022 走看看