.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 ...
随机推荐
- C# Thread.Abort方法与ThreadAbortException异常(取消线程与异常处理)
1.Abort当前线程,后续程序不会执行 class Program { public static Thread thread1; static void Main(string[] args) { ...
- bash: telnet: command not found (Linux安装telnet)
问题描述: centos 系统没有 telnet 命令 bash: telnet: command not found 1.安装telnet服务 (3个) yum install xinetd tel ...
- 一文搞定所有 web 自动化常见问题
Firefox 1. Firefox路径问题 firefox火狐浏览器去完成自动化测试时,代码报了如下错误: Cannot find firefox binary in PATH. mark sure ...
- Beta冲刺(7/7)——2019.5.29
作业描述 课程 软件工程1916|W(福州大学) 团队名称 修!咻咻! 作业要求 项目Alpha冲刺(团队) 团队目标 切实可行的计算机协会维修预约平台 开发工具 Eclipse 团队信息 队员学号 ...
- freemarker模板文件的4个组成部分
FreeMarker模板文件主要由以下4个部分组成:1.文本,直接输出的部分.2.注释,即<#–…–>格式不会输出.3.插值(Interpolation):即${..}或者#{..}格式的 ...
- 大数据基础总结---HDFS分布式文件系统
HDFS分布式文件系统 文件系统的基本概述 文件系统定义:文件系统是一种存储和组织计算机数据的方法,它使得对其访问和查找变得容易. 文件名:在文件系统中,文件名是用于定位存储位置. 元数据(Metad ...
- 硬件笔记之制作MacOS Mojave U盘USB启动安装盘方法
0x00 概述 随着苹果 macOS Mojave 正式版发布,很多使用 Mac 电脑的同学都已升级到最新版了.但如果你对系统有洁癖或原本系统已凌乱不堪,那么可能还是希望能格式化「全新安装 macOS ...
- SpringBoot 通过jjwt快速实现token授权
A 10分钟了解JSON Web令牌(JWT)https://baijiahao.baidu.com/s?id=1608021814182894637&wfr=spider&for=p ...
- RandomAccessFile vs FileChannel.open(path);
What kind of FileChannel object does the FileChannel.open(path) method return? Is it still random ac ...
- Asp.Net Core采用MailKit部署到Linux Docker连接邮件服务器报错
前段时间看文章了解到发邮件的SmtpClient已经过时了,微软官方推荐大家用其他解决方案,例如MailKit. https://docs.microsoft.com/zh-cn/dotnet/api ...