.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 ...
随机推荐
- Oracle--SMON
一,SMON功能 a) 系统监控管理,定期合并空闲,回收临时段: b) 做实例的恢复:前滚.回滚.释放资源 二,SMON什么时候做恢复? 数据修改随时发生,但是数据同步定期做:所以会产生脏块(灰块), ...
- swagger案例Swagger案例
pom <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework ...
- SpringCloud与Dubbo区别对比
1:SpringCloud与Dubbo区别对比 (1):活跃度 目前SpringCloud的活跃度明显远高于Dubbo(参考github) (2):主要区别 Dubbo Spring Cloud ...
- Jenkins生成APK链接的二维码
Window环境 1.下载安装Python如3.7.5版本,安装Python到电脑上如C:\Python37,将C:\Python37,C:\Python37\Scripts添加到Path环境变量中 ...
- Web应急:网站被植入Webshell
网站被植入webshell,意味着网站存在可利用的高危漏洞,攻击者通过利用漏洞入侵网站,写入webshell接管网站的控制权.为了得到权限 ,常规的手段如:前后台任意文件上传,远程命令执行,Sql注入 ...
- service的yaml说明
apiVersion: v1 kind: Service metadata: name: nginx-service labels: app: nginx spec: ports: - port: 8 ...
- Java中转换为二进制的几种实现
public class HexUtil { private static final String[] DIGITS_UPPER = {"0", "1", & ...
- HBase统计表行数(RowCount)的四种方法
背景:对于其他数据存储系统来说,统计表的行数是再基本不过的操作了,一般实现都非常简单:但对于HBase这种key-value存储结构的列式数据库,统计 RowCount 的方法却有好几种不同的花样,并 ...
- windows 2012 IIS 部署 .net core HTTP Error 502.5 - Process Failure 错误解决办法
安装系统补丁: 2012 R2对应>Windows8.1-KB2999226-x64.msu 下载地址: https://www.microsoft.com/zh-CN/download/det ...
- v-text和v-html绑定数据显示
1.v-text:相当有js的$("#root").text(); 2.v-html 相当于js的$("#root").html(); 3.插值赋值的数据会被v ...