案例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. (十六)golang--匿名函数

    Go支持匿名函数,如果我们某个函数只是使用一次,可以考虑使用匿名函数,匿名函数也可以实现多次调用: 匿名函数的使用方式:(1)在定义匿名函数的时候就直接调用,这种方式匿名函数只调用一次: (2)将匿名 ...

  2. javascript碰撞检测的方法

    javascript碰撞检测的方法需要把要检测碰撞的精灵都放到数组里array push 然后循环遍历数组里的精灵检测碰撞 ps:不放到数组里没办法循环遍历检测每个精灵核心代码如下 <pre&g ...

  3. python之函数filter、reduce

    ---恢复内容开始--- 一.filter函数 filter() 函数用于过滤序列,过滤掉不符合条件的元素,返回由符合条件元素组成的新列表. 该接收两个参数,第一个为函数,第二个为序列,对序列中每个元 ...

  4. Java : JavaWeb和Tomcat相关

    部署:1.直接把项目移动到webapps文件夹下, 用文件夹名访问(如果ROOT文件夹可以直接访问)2.也可以把war包放到webapps文件夹下, tomcat自动解压,但是删除war包必须要停止t ...

  5. SSM基本依赖及配置

    需要了解具体配置文件的作用到:SSM基本配置详解 示例项目:SSMDemo 依赖 基本依赖 <properties> <spring.version>5.0.6.RELEASE ...

  6. golang --os系统包

    环境变量 Environ 获取所有环境变量, 返回变量列表 func Environ() []string package main import ( "fmt" "os ...

  7. 关于.Net Core 前后端分离跨域请求时 ajax并发请求导致部分无法通过验证解决办法。

    项目中有这样一个页面.页面加载的时候会同时并发6个ajax请求去后端请求下拉框. 这样会导致每次都有1~2个“浏览器预请求”不通过. 浏览器为什么会自动发送“预请求”?请看以面连接 https://b ...

  8. Python【day 9】函数入门1

    1.什么是函数 函数的概念:对功能或者动作的封装 函数的好处:避免重复代码 2.函数的定义 1.函数的定义 def 函数名(形参列表): 函数体(return) 2.函数的调用 函数名(实参列表) 3 ...

  9. Mybatis源码解析(一) —— mybatis与Spring是如何整合的?

    Mybatis源码解析(一) -- mybatis与Spring是如何整合的?   从大学开始接触mybatis到现在差不多快3年了吧,最近寻思着使用3年了,我却还不清楚其内部实现细节,比如: 它是如 ...

  10. 立即执行函数(function(){})()与闭包

    立即执行函数 匿名(function(){})() 当一个匿名函数被括起来,然后再在后面加一个括号,这个匿名函数就能立即运行起来. $(function(){}) $(function(){});是$ ...