.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 ...
随机推荐
- java8 HashMap源码 详细研读
HashMap原理 目的: 单纯分析和学习hashmap的实现,不多说与Hashtable.ConcurrentHashMap等的区别. 基于 jdk1.8 在面试中有些水平的公司比较喜欢问HashM ...
- 1 datax 安装和简单使用
DataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL.Oracle.SqlServer.Postgre.HDFS.Hive.ADS.HBase.TableStore(O ...
- c语言中static 函数和普通函数的区别
C程序一直由下列部分组成: 1)正文段——CPU执行的机器指令部分:一个程序只有一个副本:只读,防止程序由于意外事故而修改自身指令: 2)初始化数据段(数据段)——在程序中所有赋了初值的全局变量,存放 ...
- nth-of-type(n)和nth-child(n)的区别
nth-of-type 与nth-child都属于css选择器,都是在同级别节点中找到第n个元素,前者是先确定元素类型,再计算n的位置:后者是先确定n的位置,再确定元素类型 例: <div cl ...
- __attribute__((format(printf, a, b)))
最近,在看libevent源码,第一次看到__attribute__((format(printf, a, b)))这种写法.因此,在这里记录下用法. 功能:__attribute__ format属 ...
- scala的应用--UDF:用户自定义函数
在window10下安装了hadoop,用ida创建maven项目. <properties> <spark.version>2.2.0</spark.version&g ...
- Spring-Boot-操作-Redis,三种方案全解析!
在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了,关于 Redis,松哥之前有一个系列教程,尚不了解 Redis 的小伙伴可以参考这个教程: Redis 教 ...
- Prometheus 监控Mysql服务器及Grafana可视化
Prometheus 监控Mysql服务器及Grafana可视化. mysql_exporter:用于收集MySQL性能信息. 使用版本 mysqld_exporter 0.11.0 官方地址 使用文 ...
- Java中如何获取一个类中泛型的实际类型
本文链接:https://blog.csdn.net/kuuumo/article/details/83021158 _______________________________________ ...
- ImageUtility辅助类
public class ImageUtility { #region 合并用户QR图片和用户头像 /// <summary> /// 合并用户QR图片和用户头像 /// </sum ...