反射(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; }

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

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

时间: 2024-08-08 09:39:15

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

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

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

(转).net项目技术选型总结

原文作者:mcgrady 原文地址:.net项目技术选型总结 做.net开发已经几年了,也参与开发了很多大大小小的项目,所以现在希望总结出一套开发.net项目的常用技术,也为以后做项目技术选型的时候作为参考. 数据库 小型项目:SQLite 中大型项目:MS SQL Server(国内) / Mysql(国外) 数据访问技术 SqlHelper(ADO.NET) 轻型ORM:Dapper / PetaPoco 大型ORM:EF / NHibernet 服务端技术 ASP.NET MVC WCF

团队项目-技术概要

团队项目-技术概要 一.简述 1.1 概述 根据网站的需求,我们团队在经过网上调研比较之后,决定使用bootstrap作为前端开发框架,Django作为后端服务器开发框架.选用MySQL作为数据库.在开发阶段使用sqlite作为临时的数据库. 1.2 前端技术 我们团队选择了bootstrap v3.3.7作为前端框架.一方面由于其文档教程较为丰富,另一方面在于其社区活跃,使用的人多.遇到困难能够更轻松地解决. 1.3 后端技术 我们团队比较了基于Java的spring,基于python的web

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

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

小巨蛋项目技术总结与心态总结

心态总结:沉得住气,方成得了器.收获多少,常不在于付出多少,而是受外力使然或偶然因素所致.不要希望付出什么,就一定要得到什么,坚持不懈专注某事,若失之东坡,且收之桑榆.凡事须看远些,急功未必近利,有时成功的脚步来的很慢.需要耐心聆听与等候.别梦想一些完全做不到的事情,只要走在路上,尽头定有风景. 打代码要一步一步打,不要一步登天,有事情是要说出来的,不要去等着对方领悟,等到最后只能是伤心和失望.在这个项目中我发现沟通也是很重要的,理清思路然后再写代码.不要一看到项目就想立刻把他做出来,要一边想着

.net项目技术选型总结

数据库 小型项目:SQLite 中大型项目:MS SQL Server(国内) / Mysql(国外) 数据访问技术 SqlHelper(ADO.NET) 轻型ORM:Dapper / PetaPoco 大型ORM:EF / NHibernet 服务端技术 ASP.NET MVC WCF ASP.NET WebAPI 前端技术 JavaScript jQuery+jQuery UI 前端框架:Easy UI(轻型),ExtJs(大型),BootStrap 图表:FushionCharts,Hig

项目技术总结

最近做了一个比较小的java web网站,这里简单介绍一下项目里用到的一些技术. 1.jquery.js -- 官网 http://jquery.com/ 开发前端必然用到JS,要想高效率运用JS,怎么少得了Jquery? 下面来简单比较一下原生JS和JQuery的语法,相信你能体会到Jquery的强大之处: 1).获得到某个具有ID的元素对象--jquery强大的选择器 JS: var obj = document.getElemnetById("ID"); Jquery: var

关于项目技术选型的思考

2014年12月加入了一个新的项目,这是一个游戏的辅助项目,其实可以认为是一个典型的互联网产品.这个综合使用了c/s和b/s两种结构.因为游戏相关的项目采用c/s是自然而然的事情,同时运用b/s结构就值得玩味了.在接手该项目b/s相关部份工作的过程中促使我开始认真思考关于一个技术团队在开发一个产品的过程中应该如何选择技术和工具的问题. 这个问题完全没有标准答案,但实际上在纷乱无章的表象背后其实还是有据可循的.首先从程度员的角度来看.毎个人其实都有尝试新技术的冲动(我所说的新技术包括新产生的技术和

深入研究互联网项目技术或者项目团队建设

holison将长期坚持专注于互联网技术或者项目团队建设研究,致力于成为互联网平台或者项目团队建设方面的专家.为更多的中小企业打造出强大的互联网平台出发. 坚持始终以帮助到求职者为出发点: 坚持始终以帮助到用人单位为出发点: 坚持始终以帮助到同事为出发点: 坚持不断提升服务质量和效益并举: 目前这块的行业现状总体很糟糕.未来的企业,或许都有必要建设自己的互联网基础设施平台.互联网项目的失败率很高根源在于互联网平台建设难度大.人才难找团队建设难的问题.就我个人经历和体会,做好以下几点,在团队建设上