.Net反射在项目中的应用
案例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反射在项目中的应用的更多相关文章
- Type.GetType()反射另外项目中的类时返回null的解决方法
项目1:ProjectA namespace ProjectA { public class paa { .... } } Type.GetType("paa")返回null Ty ...
- 使用反射+策略模式代替项目中大量的switch case判断
我这里的业务场景是根据消息类型将离线消息存入mongoDB不同的collection中.其中就涉及到大量的分支判断,为了增强代码的可读性和可维护性,对之前的代码进行了重构. 先对比一下使用反射+策略模 ...
- 项目中的那些事---Java反射的应用
最近工作中遇到一个这样的问题: 为某个项目中的所有接口做一个测试工具,使用java Swing技术,该项目有不同的版本,不是所有版本中的接口都是相同的,而我做的工具需要兼容所有版本. 于是就引入了这样 ...
- CocosCreator反射在Android中的使用
CocosCreator反射在Android中的使用 新建一个CocosCreator项目,然后点击构建 构建完成之后,即可用AndroidStudio打开构建的项目 使用AndroidStudio打 ...
- C#项目中常用到的设计模式
1. 引言 一个项目的通常都是从Demo开始,不断为项目添加新的功能以及重构,也许刚开始的时候代码显得非常凌乱,毫无设计可言.但是随着项目的迭代,往往需要将很多相同功能的代码抽取出来,这也是设计模式的 ...
- 控制反转和spring在项目中可以带来的好处
Spring实例化Bean的三种方式分别是: 1,xml配置使用bean的类构造器 <bean id="personService" class="cn.servi ...
- SparkSQL项目中的应用
Spark是一个通用的大规模数据快速处理引擎.可以简单理解为Spark就是一个大数据分布式处理框架.基于内存计算的Spark的计算速度要比Hadoop的MapReduce快上100倍以上,基于磁盘的计 ...
- ANT 发布项目中 build.xml 文件的详细配置
xml 代码 <?xml version="1.0" encoding="UTF-8"?> <!-- name:对应工程名字 default: ...
- Axis2在Web项目中整合Spring
一.说明: 上一篇说了Axis2与Web项目的整合(详情 :Axis2与Web项目整合)过程,如果说在Web项目中使用了Spring框架,那么又改如何进行Axis2相关的配置操作呢? 二.Axis2 ...
随机推荐
- 责任链模式Scala的7种实现
责任链模式是经典的GoF 23种设计模式之一,也许你已经了解这种模式.不管你是否熟悉,建议读者在阅读本文之前,不妨先思考下面三个问题: (1) 如何用多种风格迥异的编程范式来实现责任链模式? (2) ...
- 实验一 Linux基础与Java开发环境
实验一 (一)实验内容 基于命令行和IDE(Intellj IDEA 简易教程http://www.cnblogs.com/rocedu/p/4421202.html)进行简单的Java程序编辑.编译 ...
- SpringCloud-ZUUL网关Cookie被拦截
在application.properties文件中添加配置(注意后面的值为空) zuul.sensitiveHeaders= org.springframework.cloud.netflix.zu ...
- 解决SpringDataJpa实体类中属性顺序与数据库中生成字段顺序不一致的问题
一.在application.yml配置中添加数据库根据实体类自动创建数据库表的配置(这里数据库采用MySQL数据库) jpa: database: MYSQL show-sql: true #Hib ...
- numpy 数组增加列,增加行的函数:column_stack,row_stack
def fun_ndarray(): a = [[1,2,7], [-6,-2,-3], [-4,-8,-55] ] b = [3,5,6] a = np.array(a) b = np.array( ...
- jenkins+sonarqube进行代码质量检测
JavaNeverGiveUp教程篇 用jenkins+sonarqube去检查代码是非常方便的,它能检查出代码中可能存在的一些问题,比如io流未关闭.空指针异常.死循环.代码不规范等问题. 1. 搭 ...
- SQLServer --------- 设置主键自增长
设置主键自增长的两种方式 1.通过图形化的的操作方法进行设置 新建的时候进行设置 第二种是右击设计对已经建好的表进行设置 设置主键 设置自增长 标识增量标识每次自增加多少 标识种子标识从多少开始自 ...
- $scope里的$watch方法
一.$watch的作用 监听model,如果model发生变化,则触发某些事情. 二.$watch的格式 $scope. $watch(watchFn,watchAction,deepWatch); ...
- Zookeeper到底是什么
1. 什么是Zookeeper 用一句话对其进行定义就是:它是一套高吞吐的分布式协调系统.从中我们可以知道Zookeeper至少具有以下特点: 1.Zookeeper的主要作用是为分布式系统提供协调服 ...
- 剑指offer 栈的压入和弹出
题目描述输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序.假设压入栈的所有数字均不相等.例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈 ...