C#反射在实际应用中的实例代码
发布时间:2022-11-25 05:06:21
标签:反射,应用
反射提供了封装程序集、模块和类型的对象(Type 类型)。可以使用反射动态创建类型的实例,将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。
下面我就以一个事例来说明反射在项目中的使用方法。
大体分为三个步骤:
第一步,在web.config配置如下代码(目的是为了动态的去修改所需分析的dll)
<appSettings>
<add key="BizAssembly" value="PSMS.Biz"/>
</appSettings>
第二步,定义一个用于处理公共程序集的类
/// <summary>
/// 完成从客户端获取远程业务逻辑对象的代理
/// </summary>
public static class FacadeService
{
static IDictionary<string, Type> serviceClassCatalog;//定义一个键值对接口对象
static FacadeService()
{
serviceClassCatalog = new Dictionary<string, Type>();
Assembly assembly = Assembly.Load(new AssemblyName(ConfigurationManager.AppSettings["BizAssembly"]));//开始加载程序集对象
Type[] types = assembly.GetExportedTypes();//获取程序集中所有对象的类型集合
Type baseType = typeof(MarshalByRefObject);
foreach (Type type in types)
{
if (baseType.IsAssignableFrom(type))
{
Type[] interfaces = type.GetInterfaces();
//此处登记的是接口类型最终派生的接口类型,即最高层接口
if (interfaces.Length > 0)
{
serviceClassCatalog.Add(interfaces[0].FullName, type);
}
}
}
}
/// <summary>
/// 根据传入的业务逻辑类的接口类型,返回实现该接口的类型对象实例远程代理
/// </summary>
/// <typeparam name="IFacade">具体的业务逻辑接口类型</typeparam>
/// <returns>实现该接口的类型对象实例远程代理</returns>
public static IFacade GetFacade<IFacade>()
{
string typeName = typeof(IFacade).FullName;
if (serviceClassCatalog.ContainsKey(typeName))
{
object realProxy = Activator.CreateInstance(serviceClassCatalog[typeName]);
return (IFacade)realProxy;
}
else
{
throw new Exception("未包含接口所定义的服务类型。");
}
}
}
第三步,在程序代码中实现调用
public partial class MyTest: System.Web.UI.Page
{
//在后台代码中构建一个(测试用的)接口的实例对象
static IUserInfoFacade userInfoFacade = FacadeService.GetFacade<IUserInfoFacade>();
//其它功能实现代码
//......
//......
private void Method1()
{
//具体的调用
List<UserInfo> lstUserInfo = userInfoFacade.GetUserInfoList(unitCode, 0, 0);
//其它功能实现代码
//......
//......
}
}


猜你喜欢
- 实践过程效果代码public partial class Form1 : Form{ public Form1()
- 二叉堆什么是二叉堆二叉堆本质上是一种完全二叉树,它分为两个类型最大堆:最大堆的任何一个父节点的值,都大于等于它的左、右孩子节点的值(堆顶就是
- 使用 AppbarLayout 和 MotionLayout 实现常用的布局效果前文我们讲了协调滚动的一些定义方式,我们在开发中常用的几种效
- 注解作用注解是JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有
- 前言本文主要给大家介绍了关于C/C++混合编程extern “C”使用的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介
- HttpServletResponse.sendRedirect与RequestDispatcher.forward方法都可以实
- springboot2启动时执行,初始化(或定时任务)servletContext需求:springboot 启动后自动执行,初始化数据,并
- 前言大家都知道类的继承规则:1、派生类自动包含基类的所有成员。但对于基类的私有成员,派生类虽然继承了,但是不能在派生类中访问。2、所有的类都
- 背景近期在调研一个开源仓库,于是将 代码 从github下载后,当IDEA sync依赖时出现Cannot resolve org.four
- 1.WinMergeWinMerge是一款运行于Windows系统下的文件比较和合并工具https://winmerge.org/downl
- 本文实例讲述了C#实现系统托盘通知的方法。分享给大家供大家参考。具体实现方法如下:namespace WindowsApplication1
- 一、什么是JMSJMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(M
- 一)Document介绍API来源:在JDK中javax.xml.*包下使用场景:1、需要知道XML文档所有结构2、需要把文档一些元素排序3
- 一、前言在spring中,定义rabbitMq的消费者可以相当方便,只需要在消息处理类或者类方法加上@RabbitListener注解,指定
- 本文实例讲述了C#使用Ado.net读取Excel表的方法。分享给大家供大家参考。具体分析如下:微软NET提供了一个交互的方法,通过使用AD
- 1、Java主要特点简单性、跨平台性、分布性、安全性、健壮性、平 * 立与可移植性、多线程、动态性、面向对象的编程语言、支持垃圾自动收集处理等
- Compose中我们应该怎么使用地图呢?像之前我们在xml里面创建MapView,都是在Activity里面,管理MapView生命周期,和
- 在本次项目中,由于时间紧张直接使用DWR做Ajax请求!要求的是动态展示,那就需要使用DWR轮询请求,但是需要做异常情况下的一些处理!特别是
- 前言有时候可能会遇到需要批量修改文件格式的需求,但百度了很久都没有找到相关的应用什么的,于是学过两天 Android 的我想自己去弄一个 A
- 因为项目中之前的模块用的分页插件是Datatables,很方便,但是新做的模块表格中的布局有变化,Datatables插件满足不了了。为了风