案例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. 百度编辑器ueditor批量上传图片或者批量上传文件时,文件名称和内容不符合,错位问题

    百度编辑器ueditor批量上传附件时,上传后的文件和实际文件名称错误,比如实际是文件名“dongcoder.xls”,上传后可能就成了“懂客.xls”.原因就是,上传文件时是异步上传,同时进行,导致 ...

  2. ASP.NET Core基于微软微服务eShopOnContainer事件总线EventBus的实现

    这个EventBus的实现是基于微软微服务https://github.com/dotnet-architecture/eShopOnContainers项目的,我把它从项目中抽离出来,打包成nuge ...

  3. vuejs怎么和thinkphp结合

    vue在服务端部署时,我们都知道通过npm run build 指令打包好的dist文件,通过http指定是可以直接浏览的,Thinkphp通过域名指向index.php文件才可以浏览.要使前端正常调 ...

  4. Java 中要将 String 类型转化为 int 类型

    在 Java 中要将 String 类型转化为 int 类型时,需要使用 Integer 类中的 parseInt() 方法或者 valueOf() 方法进行转换. 例1: 1 2 3 4 5 6 S ...

  5. golang 学习笔记 -- struct interface的使用

    一个 interface 类型定义了一个方法集做接口. 区分goalng的方法和函数 func go() { fmt.Println('go to home') } 这是函数 type car str ...

  6. Jenkins的使用(一)

    Jenkins 介绍: Jenkins是一个独立的开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成 变成可能.前身是Huds ...

  7. C# 读取带有命名空间的xml

    XML文本: <?xml version="1.0" encoding="utf-8"?> <ECG xmlns:xsi="http ...

  8. vue同一个路由,但参数发生变化,页面不刷新的问题(vue监听路由参数变化重新渲染页面)

    watch: { $route: function(newVal, oldVal) { console.log(oldVal); //oldVa 上一次url console.log(newVal); ...

  9. .Net Core 给WebApi接口返回值添加全局的日期格式化

    public void ConfigureServices(IServiceCollection services) { services.AddMvc().AddJsonOptions(option ...

  10. APS的未来会怎么样?历史给了你答案

    一项技术从概念推广到实际应用推广需要十五到二十年时间,21世纪的头十年是APS的概念推广时期,随着理论的成熟,软件的实用化,企业应用的深入,下一个十年,APS将是实际应用推广的时期. APS兴起 从上 ...