.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 ...
随机推荐
- python脚本生成exe程序
去年十一月换了新公司后,一直没闲着,马不停蹄地接不同的需求,一个版本一个版本的迭代,也没时间研究python了.十一休假归来,某日,老婆问金融量化需要学python吗?并分享了一个公众号文章,内容是吹 ...
- vue子组件数据跟着父组件改变
父组件的代码 <template> <div class="home"> <img alt="Vue logo" src=&quo ...
- ABP vNext中使用开源日志面板 LogDashboard
ABP vNext 使用 logdashboard 本文示例源码:https://github.com/liangshiw/LogDashboard/tree/master/samples/abpvn ...
- 手把手教你 通过 NuGet.Server 包 搭建nuget服务器,并使用桌面工具上传 nuget 包,免命令行
新建web项目 工具:VS2013 版本:.Net Framework 4.6,低版本也行,不过要找到对应版本的Nuget.Server 装了NuGet客户端(百度如何安装) WebForm或MVC都 ...
- Dictionary不可以迭代修改值
var buffer = new List<string>(showDict.Keys); foreach (var key in buffer) { if (showDict[key] ...
- ros:init()
ros::init()是ROS程序调用的第一个函数,用于对ROS程序的初始化. ros::init()函数的声明在ROS代码中的./src/ros_comm/roscpp/include/ros/in ...
- Redis 内存管理 源码分析
要想了解redis底层的内存管理是如何进行的,直接看源码绝对是一个很好的选择 下面是我添加了详细注释的源码,需要注意的是,为了便于源码分析,我把redis为了弥补平台差异的那部分代码删了,只需要知道有 ...
- 【LOJ#6485】LJJ 学二项式定理(单位根反演)
[LOJ#6485]LJJ 学二项式定理(单位根反演) 题面 LOJ 题解 显然对于\(a0,a1,a2,a3\)分开算答案. 这里以\(a0\)为例 \[\begin{aligned} Ans&am ...
- redux-thunk形式
onClick(e) { e.preventDefault(); const { user, pass } = this.refs; this.props.dispatch(login(user.va ...
- 【04】Kubernets:资源清单(pod)
写在前面的话 前面我们提到过,纯手敲 K8S 名称管理 K8S 服务只是作为我们了解 K8S 的一种方案,而我们最终管理 K8S 的方法还是通过接下来的资源清单的方式进行管理. 所以从本章节开始,将会 ...