反射(C#)______ITOO项目技术总结(一)

反射提供了封装程序集、模块和类型的对象(Type类型)。可以使用反射动态创建类型的实例。将类型绑定到现有对象,或从现有对象获取类型并调用其方法或访问其字段和属性。如果代码中使用了属性,可以利用反射对它们进行访问。

一、概述

反射在下列情况下很有用:

  1. 需要访问程序元数据的属性。
  2. 检查和实例化程序集中的类型
  3. 在运行时构建新类型。
  4. 执行后期绑定,访问在运行时创建的类型的方法。

在程序集中可以直接引用dll文件,从而达到使用该dll文件中的类和方法,现在可以通过反射机制达到同样的效果。

二、用途

有了反射,即可对每一个类型了如指掌。如果获得了构造函数的信息,即可直接创建对象,即使这个对象的类型在编译时还不知道。

  1. 使用 Assembly 定义和加载程序集,加载在程序集清单中列出的模块,以及从此程序集中查找类型并创建该类型的实例。
  2. 使用 Module 发现以下信息:包含模块的程序集以及模块中的类等。 您还可以获取在模块上定义的所有全局方法或其他特定的非全局方法。
  3. 使用 ConstructorInfo 发现以下信息:构造函数的名称、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetConstructors 或 GetConstructor 方法来调用特定的构造函数。
  4. 使用 MethodInfo 发现以下信息:方法的名称、返回类型、参数、访问修饰符(如 public 或 private)和实现详细信息(如 abstract 或 virtual)等。 使用 Type 的 GetMethods 或 GetMethod 方法来调用特定的方法。
  5. 使用 FieldInfo 发现以下信息:字段的名称、访问修饰符(如 public 或 private)和实现详细信息(如static)等;并获取或设置字段值。
  6. 使用 EventInfo 发现以下信息:事件的名称、事件处理程序数据类型、自定义特性、声明类型和反射类型等;并添加或移除事件处理程序。
  7. 使用 PropertyInfo 发现以下信息:属性的名称、数据类型、声明类型、反射类型和只读或可写状态等;并获取或设置属性值。
  1. 使用 ParameterInfo 发现以下信息:参数的名称、数据类型、参数是输入参数还是输出参数,以及参数在方法签名中的位置等。

在一个应用程序域的仅反射上下文中工作时,使用 CustomAttributeData 来发现有关自定义特性的信息。 通过使用 CustomAttributeData,不必创建特性的实例就可以检查它们。

三、实践

小团队做了个Demo,小编就拿这个反射Demo举例说明吧。

反射加载程序集的几种方法

1、在小编的Demo中运用的反射实例如下实现。

<span style="font-size:18px;"> //使用Assembly 定义和加载程序集
            Assembly assembly = Assembly.Load("Test_DAL");</span>

此时无需在引用相应的dll文件,但需要注意的是 输出路径的修改

2、小编尝试过其他的方式 ,加载路绝对路径,找到相应的文件类

 <span style="font-size:18px;">//通过绝对路径加载方式一
            Assembly assembly = Assembly.LoadFile("E:\\技术分享——徐露\\Test_Reflection\\Test_Reflection\\bin\\Debug\\Test_DAL.dll");</span>
<span style="font-size:18px;">  //通过绝对路径加载方式二
            Assembly assembly = Assembly.LoadFrom ("E:\\技术分享——徐露\\Test_Reflection\\Test_Reflection\\bin\\Debug\\Test_DAL.dll");</span>

<span style="font-size:18px;">//通过绝对路径加载方式三
            Assembly assembly = Assembly.ReflectionOnlyLoadFrom  ("E:\\技术分享——徐露\\Test_Reflection\\Test_Reflection\\bin\\Debug\\Test_DAL.dll");</span>

是不是感觉如出一辙呢,后来小编一想通过默认的路径加载,此种方法运用反射就没有意义了,因为已经做不到动态更换dll,在试想加载默认路径和引用相应的dll,不是同样的么。所以说团队中

Assembly assembly = Assembly.Load("Test_DAL");

这种方式灵活性更好。

四、总结

ITOO项目中,小编身在其中,不知起意。通过这次技术分享,小编明白了:

  1. 在程序的加载过程中
    通过反射创建实例化每一个类,此时的容器相当一个大的hashtable,容纳这些创建的类

 <!--创建容器-->
  <configSections>
    <sectionGroup name="spring">
      <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core" />
      <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" />
    </sectionGroup>
  </configSections>
  1. 创建之后,可以有两种方法获得在hashtable中所创建的类

①在配置文件中标识id(key值)
和type(value),根据WCF层中的key值查找获得value,从而找到相应的类

<spring>
    <context>
      <!--<resource uri="assembly://SpringLover/SpringLover/Objects.xml"/>-->
      <!--<resource uri="~/Objects.xml"/>
      <resource uri="~/objects.xml"/>
      <resource uri="file://objects.xml"/>-->
      <resource uri="config://spring/objects" />
    </context>
    <objects xmlns="http://www.springframework.net">
      <object id="FreshEntities" type="ITOO.FreshStuNumConfig.Model.FreshEntities,ITOO.FreshStuNumConfig.Model" singleton="false" />
      <!--DbSession层的的注解-->
      <object id="DBSession" type="ITOO.FreshStuNumConfig.DAL.DBSession,ITOO.FreshStuNumConfig.DAL" singleton="false">
        <!--加入属性注入,指向D层的注入-->
        <property name="StudentManageDal" ref="StudentManageDal" />
        <property name="FreshClassDal" ref="FreshClassDal" />
        <property name="FreshMajorDal" ref="FreshMajorDal" />
        <property name="FreshDepartmentDal" ref="FreshDepartmentDal" />
      </object>
      <!--D层的的注解-->
      <object id="StudentManageDal" type="ITOO.FreshStuNumConfig.DAL.StudentManageDal,ITOO.FreshStuNumConfig.DAL" singleton="false" />
      <object id="FreshDepartmentDal" type="ITOO.FreshStuNumConfig.DAL.FreshDepartmentDal,ITOO.FreshStuNumConfig.DAL" singleton="false" />
      <object id="FreshMajorDal" type="ITOO.FreshStuNumConfig.DAL.FreshMajorDal,ITOO.FreshStuNumConfig.DAL" singleton="false" />
      <object id="FreshClassDal" type="ITOO.FreshStuNumConfig.DAL.FreshClassDal,ITOO.FreshStuNumConfig.DAL" singleton="false" />

      <!--B层的的注解-->
            <object id="StudentManageBll" type="ITOO.FreshStuNumConfig.BLL.StudentManageBll,ITOO.FreshStuNumConfig.BLL" singleton="false" />
      <object id="DistributeClassBll" type="ITOO.FreshStuNumConfig.BLL.DistributeClassBll,ITOO.FreshStuNumConfig.BLL" singleton="false" />
      <object id="DistributeStudentNumberBll" type="ITOO.FreshStuNumConfig.BLL.DistributeStudentNumberBll,ITOO.FreshStuNumConfig.BLL" singleton="false" />
      <object id="DepartmentBll" type="ITOO.FreshStuNumConfig.BLL.DepartmentBll,ITOO.FreshStuNumConfig.BLL" singleton="false" />
      <object id="FreshMajorBll" type="ITOO.FreshStuNumConfig.BLL.FreshMajorBll,ITOO.FreshStuNumConfig.BLL" singleton="false" />
    </objects>
  </spring>

在WCF层 key值可根据配置文件的id ,想对应查找出来

 IStudentManageBll StudentBll = SpringHelper.GetObject<IStudentManageBll>("StudentManageBll");

②依赖注入 ,ITOO框架中的DbSession中就是通过这种方式实现的

 //声明DbSession管理的StudentManageDal
        public IStudentManageDal StudentManageDal { get; set; }

这只是小编浅显的理解,和大家分享一下

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 07-30

反射(C#)______ITOO项目技术总结(一)的相关文章

NO4 系统移植-项目技术资料共享解决方案

系统移植项目-技术资料共享解决方案 前言 本文只做解决方案分析,不做具体技术点的说明 一:为什么需要技术资料的共享 系统移植项目的移植点可以分:(1)操作系统移植,例如:由window移植到linux上,由Aix移植到window上等,(2)程序语言的移植,例如vb6升级到vb.net,由PHP移植到Java上等,(3)后台数据库移植,例如:DB2移植到sql server,由sql server移植到Oracle上等. 一般的项目都是包含多个移植点,很少能有一个移植点的项目. 在项目过程中,操

关于团体项目技术选型的补充

上次提到技术选型的框架,我们觉得还有些不足,所以进行了些许补充.关于中间层框架的看法:一般的程序员可能都不习惯用中间层的框架,所以通常情况下源代码中不会出现中间管理.我个人觉得,如果不用中间层的话,我们的项目完全可以用NEW来代替,因为项目比较小,用到的类的类别也少.当然,上述所说成立的前提是在用JAVA语言开发的条件下,程序员编写一个单例模式的简单容器也应该可行.如果是在C语言开发的环境下,那我就不能妄下定论了. 现在很多管理化信息软件都反对一些免费的数据库软件,因为从技术上来看,实现对多个品

新浪微博项目技术之一UI主框架搭建

一.项目整体框架搭建 二.UI主框架结构及知识点 1>.代码封装思想 封装前的代码:(四个标题需要重复写四次,重复代码较多) HomeViewController *HomeVC = [[HomeViewController alloc] init]; UINavigationController *HomeNV = [[UINavigationController alloc] initWithRootViewController:HomeVC]; //tabBarItem标题文字设置 Hom

新浪微博项目技术之一项目开发过程

一.项目开发完整流程图    1.项目总流程   2.项目需求分析形成文档    3. App制作流程 二.项目目录结构 目录结构 AppDelegate Models Macro General Helpers Vendors Sections Resources 一个合理的目录结构首先应该是清晰的,让人一眼看上去就能大概了解目录的职责,且容易应对新的变化. AppDelegate 这个目录下放的是AppDelegate.h(.m)文件,是整个应用的入口文件,所以单独拿出来. Models 这

Traveller项目技术资料

Spring Spring PecClinic:Spring官方的宠物医院项目 it.zhaozhao.info/archives/63818:SPRING JPA入门 Bootstrap www.bootcss.com:中文网 wrapbootstrap.com:bootstrap模板 http://1000hz.github.io/bootstrap-validator:bootstrap前端校验 Webjar webjars.org:官方网站 Anglarjs www.ngnice.com

项目技术架构层级规划和介绍

四横即四大层次,分别为: 1.用户渠道层:用户渠道层是直接面向最终用户.通过网站的形式向用户提供产品展示.企业市场宣传.对产品的订购.互动分享.客户关怀以及用户中心入口等功能,并提供后期扩展移动终端接入: 2.应用业务层:该层面向的是系统管理人员. 为系统管理人员提供系统的整体管理,包括产品管理.企业管理.栏目管理.交易管理.信息管理.用户管理.统计分析.客户管理和日志管理. 以及对平台支付平台.短信平台.邮件平台.仓储物流.CDN分发.呼叫中心.CRM平台等系统集成和管理等: 3.数据资源层:

移动端项目技术总结

在这次项目中,了解到视口的问题,以下为视口的叙说. meta的视口设置 为什么使用要设置视口: 定义视口的宽为设备宽,初始缩放为1倍,最大和最小缩放倍数为1,禁止用户缩放<meta name=”viewport” content=”width=device-width, initial-scale=1, maximum-scale=1,minimum-scale=1,user-scalable=0″> 这是很多手机开发商都为了让用户提要到完整的web体验而设置一个虚假的视口宽度,以欺骗浏览器这

软件项目技术点(19)——文件的保存和打开(解压缩)

保存文件 保存内容有哪些? 我们需要保存的内容信息 1)context.json 存储画布状态信息和所有元素的配置信息(这个文件在过程中生成) 2)插入的图片.音频.视频等资源 3)所用到的字体文件 4)每一帧的缩略图 将这些文件压缩到一个zip包里,我们的作品保存后的文件是dbk后缀格式的,其实就是一个压缩zip文件. 保存过程步骤解析 1)获取要保存的对象信息dtoCore,后面将其转换成字符串string后存储到文件里. 2)将保存作品用到的资源整理到fileList中,fileList对

项目技术要点

三层架构搭建 Spring.NET Nhibernate miniUI miniUI-SelectGrid 弹出选择表格-翻页选中 WCF 分布式缓存 分布式存储 数据库优化 报表服务器 SSRS 报表 递归列表 SSRS 报表 如何匿名查看 SSRS 报表 如何加参数 大数据分析 前端插件 echarts jquery.mobile-1.4.5 模块设计 权限模块设计 工作流模块设计 数据权限模块设计 接口模块设计 门户搭建 疑难杂症 其他

新浪微博项目技术之一正在播放按钮点击

一.效果图: 实现功能:在"正在播放"按钮时,切换到下一个界面并继续原歌曲的播放进度 二.实现方法及步骤 1.思路: 第一步.点击按钮事件中再show到下一个界面的时候,推出到我们创建的那个单例视图(前面已将第二个界面视图创建为单例对象)中 第二步.在点击页面播放的时候,如果当前播放为第四首歌曲,show的也是第四首的话,就不需要从头播放,继续当前位置播放即可,如果是下一首的话则需要从头播放(想清楚这个逻辑判断关系) 2.步骤: 第一步实现步骤: @interface MusicLis