案例1:项目中可能有多个DAL程序集,每个程序集使用不同的持久化技术或对应不同类型的数据库,但是它们使用同一套接口。

可以在配置文件中配置DAL程序集名称,使用反射加载程序集、创建dal对象。

这样做的好处是使用接口解耦BLL、DAL,如果需要更换其他技术的DAL,只需要修改配置文件中程序集名称即可

 /// <summary>
     /// 数据层工厂
     /// </summary>
     public class DALFactory
     {
         /// <summary>
         /// 通过反射机制,实例化接口对象
         /// </summary>
         private static readonly string _path = System.Configuration.ConfigurationManager.AppSettings["ShopCartMySqlDAL"];
         private static readonly Assembly _Assembly = Assembly.Load(DALFactory._path);

         /// <summary>
         /// 通过反射机制,实例化Base_country_culturepart接口对象
         /// </summary>
         ///<returns>Base_country_culturepart接口对象</returns>
         public static IPersonDAL PersonInstance()
         {
             return (IPersonDAL)_Assembly.CreateInstance(DALFactory._path + ".PersonDAL");
         }

 //省略其他DAL对象创建
 }
    public class PersonBLL
    {
        private static readonly IPersonDAL _dal = DALFactory.PersonInstance();
public static Person Select(IDataReader dr)
        {
            return PersonBLL._dal.Select(dr);
        }
}
//省略其他BLL

案例2:两个属性大体相同的对象,通过反射进行赋值。

 /// <summary>
         /// 将一种类型的对象向另一种类型的对象通过相同属性名称的所有属性进行赋值操作
         /// 只有SQLServer里面的实体类可以使用,因为SQLServer中有Boolean类型,需要将Int32专成Boolean
         /// </summary>
         /// <typeparam name="S">源类型</typeparam>
         /// <typeparam name="D">目标类型</typeparam>
         /// <param name="source">源对象</param>
         /// <param name="desc">目标对象</param>
         public static void SetPropertyInfoSQLServer<S, D>(S source, D desc)
         {
             PropertyInfo[] propertyInfoSources = typeof(S).GetProperties();
             PropertyInfo[] propertyInfoDescs = typeof(D).GetProperties();
             )
             {
                 foreach (PropertyInfo propertyInfoSource in propertyInfoSources)
                 {
                     foreach (PropertyInfo propertyInfoDesc in propertyInfoDescs)
                     {
                         )
                         {
                             object sourceValue = propertyInfoSource.GetValue(source, null);
                             object descValue = propertyInfoDesc.GetValue(desc, null);
                             if ((sourceValue == null && descValue != null)
                                 || (sourceValue != null && descValue == null))
                             {
                                 try
                                 {
                                     if (sourceValue.GetType() == typeof(Boolean))
                                     {
                                         propertyInfoDesc.SetValue(desc, TypeParseHelper.StrToInt32(sourceValue) ==  ? true : false, null);
                                     }
                                     else
                                     {
                                         propertyInfoDesc.SetValue(desc, sourceValue, null);
                                     }
                                 }
                                 catch (Exception)
                                 { }
                             }
                             else if (sourceValue != null && descValue != null && !sourceValue.Equals(descValue))
                             {
                                 try
                                 {
                                     if (sourceValue.GetType() == typeof(Boolean))
                                     {
                                         propertyInfoDesc.SetValue(desc, TypeParseHelper.StrToInt32(sourceValue) ==  ? true : false, null);
                                     }
                                     else
                                     {
                                         propertyInfoDesc.SetValue(desc, sourceValue, null);
                                     }
                                 }
                                 catch (Exception)
                                 { }
                             }
                             break;
                         }
                     }
                 }
                 Array.Clear(propertyInfoSources, , propertyInfoSources.Length);
                 propertyInfoSources = null;
                 Array.Clear(propertyInfoDescs, , propertyInfoDescs.Length);
                 propertyInfoDescs = null;
             }
         }

.Net反射在项目中的应用的更多相关文章

  1. Type.GetType()反射另外项目中的类时返回null的解决方法

    项目1:ProjectA namespace ProjectA { public class paa { .... } } Type.GetType("paa")返回null Ty ...

  2. 使用反射+策略模式代替项目中大量的switch case判断

    我这里的业务场景是根据消息类型将离线消息存入mongoDB不同的collection中.其中就涉及到大量的分支判断,为了增强代码的可读性和可维护性,对之前的代码进行了重构. 先对比一下使用反射+策略模 ...

  3. 项目中的那些事---Java反射的应用

    最近工作中遇到一个这样的问题: 为某个项目中的所有接口做一个测试工具,使用java Swing技术,该项目有不同的版本,不是所有版本中的接口都是相同的,而我做的工具需要兼容所有版本. 于是就引入了这样 ...

  4. CocosCreator反射在Android中的使用

    CocosCreator反射在Android中的使用 新建一个CocosCreator项目,然后点击构建 构建完成之后,即可用AndroidStudio打开构建的项目 使用AndroidStudio打 ...

  5. C#项目中常用到的设计模式

    1. 引言 一个项目的通常都是从Demo开始,不断为项目添加新的功能以及重构,也许刚开始的时候代码显得非常凌乱,毫无设计可言.但是随着项目的迭代,往往需要将很多相同功能的代码抽取出来,这也是设计模式的 ...

  6. 控制反转和spring在项目中可以带来的好处

    Spring实例化Bean的三种方式分别是: 1,xml配置使用bean的类构造器 <bean id="personService" class="cn.servi ...

  7. SparkSQL项目中的应用

    Spark是一个通用的大规模数据快速处理引擎.可以简单理解为Spark就是一个大数据分布式处理框架.基于内存计算的Spark的计算速度要比Hadoop的MapReduce快上100倍以上,基于磁盘的计 ...

  8. ANT 发布项目中 build.xml 文件的详细配置

    xml 代码 <?xml version="1.0" encoding="UTF-8"?> <!-- name:对应工程名字 default: ...

  9. Axis2在Web项目中整合Spring

    一.说明: 上一篇说了Axis2与Web项目的整合(详情 :Axis2与Web项目整合)过程,如果说在Web项目中使用了Spring框架,那么又改如何进行Axis2相关的配置操作呢? 二.Axis2 ...

随机推荐

  1. Linux record

    1.设置ubuntu密码刚安装好的ubuntu系统,没有root密码,需要用户去手动设置的. sudo passwd root 输入2次密码即可. 2. Linux下is not in the sud ...

  2. 我的周记10——“知行合一"

    印象中有个名人说过一句名言:与其游手好闲地学习,不如学习游手好闲 来自 玉伯 .  字是真的好看,有风格 现在已经是第十篇周记了,写着写着慢慢偏离了初衷,但庆幸的是坚持下来写.我相信在用心写好每篇周记 ...

  3. PHP中直接使用sql语句

    SELECT * FROM `tf_user` WHERE (`company_id` = '117' OR `other_company_ids` LIKE '%117,%' OR `other_c ...

  4. Kubernetes管理GPU应用

    目录 简介 GPU驱动 Nvidia-docker Nvidia-device-plugin 在Kubernetes上运行GPU应用 附录 简介 伴随着人工智能技术的发展,机器学习的应用场景越来越广泛 ...

  5. Ansible16:Playbook高级用法

    目录 本地执行 任务委托 任务暂停 滚动执行 只执行一次 设置环境变量 交互式提示 本地执行 如果希望在控制主机本地运行一个特定的任务,可以使用local_action语句. 假设我们需要配置的远程主 ...

  6. 奥展项目笔记01--不同网站,点击工具--开发人员工具F12,显示的页面怎么不一样

    开发人员工具F12,显示的页面不一样: 样式1: 样式2: 解决方案:兼容模式和极速模式的开发者工具不一样,改成极速模式就ok了.

  7. 使用eclipse git插件合并merge部分代码方法

    当有一个父项目,它的下面有多个子项目:或者一个项目下边,只想合并部分路径,甚至部分文件的内容,使用下边的方法可以达到目的,特此记录: 1.主项目右键 -> team -> remove f ...

  8. vue-如何实现带参数跳转页面

    [前后端分离项目之vue框架经验总结] 文/朱季谦 在vue框架的前端页面上,若要实现页面之间的带参数跳转,可参考以下实现过程: 例如,点击截图中的“查看试卷”,可实现带参跳转到相应的试卷页面,该功能 ...

  9. jquery动画控制非css属性

    JQuery的animate()方法可以通过渐变的更改CSS属性来实现简单的动画效果, 比如 $("#box").animate({height:"300px" ...

  10. Exceptionless - 本地搭建

    搭建环境:Windows 10 参与文档:https://github.com/exceptionless/Exceptionless/wiki/Self-Hosting 运行环境: .NET 4.6 ...