反射是一个很牛逼的特性,在做程序模块架构的时候非常有用,各种框架能把反射玩的飞起(我了解的主要是java web那块很多框架喜欢这么玩)。但很多时候我们写程序确实是用不上的。不过,有些常用场景下我们也可以把玩这个特性,比如获取和操作类的私有成员、用少量代码实现遍历和操作类的所有成员。

现在,让我们先说说平时会用到反射的场景,然后再讲讲面向接口编程的风骚操作。

  1. 遍历成员

比如有如下类:

我们需要将每个成员变量输出,应该怎么做呢?

做起来其实挺简单,很直观,就是把每个变量写一下:

但是,对于成员变量有几十个怎么办?也这么写么?那多蠢,重复代码一堆,而且变成了枯燥的手工劳动,一个不小心代码还容易写错。

所以这个时候,反射的好处就来了,我们可以写出这个样子:

  1. 访问私有成员

比如我们引用了一个第三方的动态库,然后需要修改里面的某些属性,然而该属性是私有成员,只能看不让改。

是不是只能干着急?这个时候我们就可以用反射来突破这层限制了。

  1. 动态加载

简单来说,就是我们知道要加载的对象接口是什么,但是不知道对象具体是什么类型的情况下实例化这个对象。就类似于面向接口做架构,换个角度说其实就是面向接口编程。

先上一段代码我们看看这种接口玩法的结构。

比如我们定义了这样一个接口和对应的类:

然后我们做结构就可以这样:

总体的代码结构不变,当我们需要增加这个结构的模块时候,只要new一个接口的对象就行,代码调用结构完全不用动。

然后我们再回归正题说说反射。正常情况下框架做好之后希望的是不改动代码,然后写写配置文件就能加载新的模块,或者说框架一开始就是在固定目录下遍历读取所有模块名字然后动态加载。

  1. 公有接口动态库定义

先写一个公有的动态库,比如编译出来名字交CLDEF.dll,用来导出接口。

  1. 编写接口对应模块

然后我们写一个满足接口的动态库来实现CLA类。

这里就需要引用第一步编译出来的CLDEF.dll。

为了不增加新的复杂性,这里我在类的名字加个前缀EXP_,方便获取时判断类属性。正常情况应该是定义一个Attribute,然后在类上方标记,调用时判断该类是否包含该Attribute。类似java常用的@xxx那玩意。

当然这个不重要,这个简单例子可以不用Attribute。

写完之后编译出动态库(比如名字叫CLA.dll),完成。

  1. 调用

我们工程里需要先引用第一步编译出来的CLDEF.dll。

然后,把第二步生成的dll放在一个固定目录。比如我们放在exe生成的同级目录下的bin目录。

System.AppDomain.CurrentDomain.BaseDirectory+”dll” 就是这个放动态库的目录了,我们通过遍历该目录下的所有dll,然后根据名字判断是不是我们要加载的类型,通过Activator.CreateInstance创建该对象。

最后就是当成接口类型进行架构性调用了。

【C#】反射与面向接口的架构相关推荐

  1. Asp.net 面向接口可扩展框架之类型转化基础服务

    新框架正在逐步完善,可喜可贺的是基础服务部分初具模样了,给大家分享一下 由于基础服务涉及面太广,也没开发完,这篇只介绍其中的类型转化部分,命名为类型转化基础服务,其实就是基础服务模块的类型转化子模块 ...

  2. 基于面向服务体系架构(SOA)和面向资源体系架构(ROA)的业务组件模型

    引言 在<面向服务体系架构(SOA)和业务组件(BC)的思考>(以下简称< SOA 和 BC >)一文中介绍了基于面向服务体系架构(SOA)的组件模型,本文按照"分离 ...

  3. swift 组件化_打造完备的iOS组件化方案:如何面向接口进行模块解耦?

    作者 | 黑超熊猫zuik,一个修行中的 iOS 开发,喜欢搞点别人没搞过的东西,钻研过逆向工程.VIPER 架构和组件化. 关于组件化的探讨已经有不少了,在之前的文章 iOS VIPER架构实践(三 ...

  4. 软件设计模式—面向接口编程

    原文作者:laoer2009 原文地址:设计模式之面向接口编程 01第一次需求 玩家有很多属性,例如:身高,性别 blalalala ,玩家可以攻击其他玩家.产品狗YY妹子写程序也是很利索,一天就把程 ...

  5. 亚马逊如何变成 SOA(面向服务的架构)?

    上一篇文章,我摘录了<程序员的呐喊>.这本书有趣的内容太多,今天再摘录一段. 1. 亚马逊公司不仅是世界最大的网络书店,还是世界最大的云服务商.它是怎么实现从电商到云商的转变呢? 一切都是 ...

  6. Asp.net 面向接口框架之应用程序上下文作用域组件

    在团队中推广面向接口开发两年左右,成果总体来说我还是挺满意的,使用面向接口开发的模块使用Unity容器配置的功能非常稳定,便于共享迁移(另一个项目使用只需要复制配置和调用接口即可)也很好扩展(操作的数 ...

  7. 面向接口编程的优点_为什么我们要面向接口编程

    到底面向?编程 面向过程编程( ProcedureOriented.简称 PO) 和 面向对象编程( ObjectOriented.简称 OO) 我们一定听过,然而实际企业级开发里受用更多的一种编程思 ...

  8. SOA (面向服务的架构)

    见:https://baike.baidu.com/item/SOA/2140650?fr=aladdin UDDI 解说参见:UDDI是什么 SOAP解说参见: SOAP:简单对象访问协议 面向服务 ...

  9. 面向服务的架构SOA

    一.什么是SOA SOA(Service-Oriented Architecture),即面向服务的架构. SOA是一种粗粒度.松耦合服务架构,服务之间通过简单.精确定义接口进行通讯,不涉及底层编程接 ...

  10. 那些年搞不懂的高深术语——依赖倒置•控制反转•依赖注入•面向接口编程...

    那些年,空气中仿佛还能闻到汉唐盛世的余韵,因此你决不允许自己的脸上有油光,时刻保持活力.然而,你一定曾为这些"高深术语"感到过困扰--依赖倒置•控制反转•依赖注入•面向接口编程.也 ...

最新文章

  1. 园区交换网络和路由网络综合设计,测试完工啦
  2. saml java实现_java-saml
  3. 密码学电子书_密码学中的电子密码书(ECB)
  4. Win10安装 WSL Ubuntu Linux系统,非双系统,完美兼容超详细版本
  5. java属性绑定_java基础:10.1 Java FX与属性绑定
  6. 计算机网络环境中学科教学,浅谈基于计算机网络环境下的农村小学的科学学科教育...
  7. docker容器不支持中文编码
  8. 手机游戏中的社交互动与任务剧情
  9. 王思聪吃热狗表情包怎么制作
  10. 微信公众号应用开发(一)
  11. 计算机里的及格率和有优秀率怎么算,Excel中怎么用函数计算成绩的及格率和优秀率?_excle优秀率及格率...
  12. 【嵌入式】学习心路历程与总结
  13. html如何做站内搜索,站内搜索-Search.html
  14. 设计模式之禅【中介者模式】
  15. 这是我见过最牛逼的Shell脚本!
  16. js点击箭头旋转的实现
  17. 使用 Kubernetes 和 Istio 进行基于容器的全面服务监控
  18. 想提高跨境电商转化率?采用这几个技巧!
  19. 我为何一直强调外包公司别去
  20. OpenCV的区域分割、轮廓检测和阈值处理

热门文章

  1. BZOJ 3190: [JLOI2013]赛车
  2. 打造物联网+WiFi融合新模式 华三通信发布卫星AP
  3. mysql表情存储报错问题
  4. PHP7中异常与错误处理与之前版本对比
  5. Xcode 7制作动态Framework
  6. c++大作业--学籍管理系统--
  7. 活动目录实战之六 使用ADMT 3.2迁移用户和计算机
  8. Sendmail with Attachment script
  9. zabbix通过skype发送报警消息之切换平台
  10. React 通过style来设置背景图片。