• DNN学习笔记代码学习:Reflection 荣


    using System;

    namespace WebApplication1
    {
     /// <summary>
     /// 映射,根据传入的参数,生成相应的对象类型及对象,
     /// 并且把取得的类型、键值对放入到缓存中。
     /// </summary>
     public class Reflection
     {
      public Reflection()
      {
       //
       // TODO: 在此处添加构造函数逻辑
       //
      }

      /// <summary>
      /// 取得相关对象
      /// </summary>
      /// <param name="objectProviderType">配置文件名称</param>
      /// <returns>相关对象</returns>
      public static object CreateObject(string objectProviderType)
      {
       return CreateObject(objectProviderType, "", "");
      }

      /// <summary>
      /// 创建相应对象
      /// </summary>
      /// <param name="objectProviderType">配置文件名称</param>
      /// <param name="objectNamespace">创建对象的命名空间</param>
      /// <param name="objectAssemblyName"></param>
      /// <returns>相应对象</returns>
      public static object CreateObject(string objectProviderType,
       string objectNamespace,
       string objectAssemblyName)
      {
       string TypeName = "";
       string CacheKey = "";

       // 根据配置信息取得ProviderConfiguration对象[defaultProvider/(objectProviderType)]
       ProviderConfiguration objProviderConfiguration = ProviderConfiguration.GetProviderConfiguration(objectProviderType);

       if (objectNamespace != "" && objectAssemblyName != "")
       {
        // 取得缓存中的类型名称  中间用分号是什么意思?以前没有见过?
        // objectNamespace是命名空间吗?DefaultProvider是类型吗?
        // objectAssemblyName是干什么的?
        TypeName = objectNamespace + "." + objProviderConfiguration.DefaultProvider + ", " + objectAssemblyName + "." + objProviderConfiguration.DefaultProvider;

        // 取得缓存的键值
        CacheKey = objectNamespace + "." + objectProviderType + "provider";
       }
       else
       {
        // 读取哈希表中的值
        TypeName = ((Provider)objProviderConfiguration.Providers[objProviderConfiguration.DefaultProvider]).Type;

        CacheKey = objectProviderType + "provider";
       }

       // 取得TypeName类型的对象.
       return CreateObject(TypeName, CacheKey);
      }

      /// <summary>
      /// 取得TypeName类型的对象。
      /// </summary>
      /// <param name="TypeName">对象类型名称</param>
      /// <param name="CacheKey">该类型缓存键值</param>
      /// <returns></returns>
      public static object CreateObject(string TypeName, string CacheKey)
      {
    //   object objectObject;
       if (CacheKey == "")
       {
        CacheKey = TypeName;
       }

       #region 根据Type取得对象类型

       // 从缓存中取得对象类型
       Type objType = (Type)DataCache.GetCache(CacheKey);

       // 如果缓存中不存在该对象类型,重新取得对象类型,并放入缓存
       if (objType == null)
       {
        try
        {
         // 向缓存中添加数据
         objType = Type.GetType(TypeName, true);
         DataCache.SetCache(CacheKey, objType);
        }
        catch(Exception exc)
        {
         LogException(exc);
        }
       }
       #endregion

       // 生成对象
       return Activator.CreateInstance(objType);
      }

      public static void LogException(Exception exc)
      {
       ExceptionLogController objExceptionLog = new ExceptionLogController();
       objExceptionLog.AddLog(exc, ExceptionLogController.ExceptionLogType.GENERAL_EXCEPTION);
      }
     }
    }

  • 相关阅读:
    C# 互操作性入门系列(三):平台调用中的数据封送处理
    C# 互操作性入门系列(二):使用平台调用调用Win32 函数
    C# 互操作性入门系列(一):C#中互操作性介绍
    远程桌面打开 提示无法打开连接文件 default.rdp
    C# for循环 创建model 在循环里和循环外引发的问题
    C# 使用ListView.CheckedItems慢的问题
    获取数据库信息
    获取文件路径
    String数据转Matrix矩阵
    文件IO(存取.txt文件)
  • 原文地址:https://www.cnblogs.com/admin11/p/193287.html
Copyright © 2020-2023  润新知