任何编程语言的任何特点都是有存在的道理的,C#中有些特点也许我们不求甚解的用过,但是如果知道它的使用背景与原理,使用起来将更加得心应手。本文主要分析的就是C#中的类型反射、晚期绑定、特性编程。阐释为什么要用这些语言特点?

首先看一下简单项目的需求:程序员开发了很多模块,每个模块对应相应的功能,不同的用户可能需要使用的模块不一样,模块以插件的形式与系统集成,也就是提供给用户一个自定义模块的功能。

更加形象的比如:一个通用的图书馆里系统中有普通老师模块、有院长模块、有校长模块、有学生模块,这些模块都具有借书的功能(每个模块借书本数不一样);这个通用的系统可能给很多学校使用,每个学校根据自己的需求选择模块。

对于上面这个需求分析,1、由于这些模块都具有借书的功能,首先想到的是建立一个接口,接口中包含一个借书的函数,所有模块都要实现这个接口。

2、分别实现这些插件模块,编译成程序集DLL文件。

3、由于这是一个通用的系统,模块的选择应该由用户决定,因此我们不能预先把所有的模块功能都编译到系统中去(晚期绑定派上用场)。

4、用户选择一个模块(DLL文件),就相当于要加载一个程序集DLL(动态加载的概念),此时的DLL与用C/C++编写的DLL不一样,它是由微软中间语言IL组成的,里面记录了

DLL所有信息的元数据。

5、需要调用具体某个DLL模块中的具体借书函数,这个时候就需要从动态加载的DLL中获取到相应的类,实例化类,调用类的成员函数,这个就需要反射来干了。

6、有的时候在大型项目中,每个模块可能有不同的子部门来做,因此每个模块应该包好有这些部门的基本信息,这个时候在编写模块的功能时候,就可利用C#中的特性编程了,利用特性可以

给模块附加上额外的信息,这些信息会被编译到程序集中,同理我们也可以反射出这些信息来。

下面是一个简单代码的例子:利用了这些特性

插件接口的定义:

View Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace CommonTypes
{//定义一个接口public interface IAppDll{void DoThing();          }//自定义特性类
    [AttributeUsage(AttributeTargets.Class)]public sealed class CarInfoAttribute : System.Attribute {public string name{ get; set;}       }}

根据上面的定义的接口约束,开发第三方的插件

View Code

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;using System.Windows.Forms;
using CommonTypes;namespace CsharpDll
{[CarInfo(name="这是第三方生产的插件")]public class CsharpModule:IAppDll{public void DoThing()//实现接口中的函数
        {MessageBox.Show("正在调用的是Csharp插件模块");} }
}

在窗体程序中调用第三方插件

View Code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;using System.Reflection;
using CommonTypes;namespace WindowsFormsApplication1
{public partial class Form1 : Form{public Form1(){InitializeComponent();}private void openToolStripMenuItem_Click(object sender, EventArgs e){//选择一个插件加载OpenFileDialog OFD = new OpenFileDialog();if (OFD.ShowDialog() == DialogResult.OK) {if (!LoadModule(OFD.FileName))MessageBox.Show("没有成功加载第三方的插件!");}}private bool LoadModule(string path) {bool FindModule = false;Assembly asm = null;try{//加载指定路径下的程序集asm = Assembly.LoadFrom(path);}catch (Exception ex) {MessageBox.Show(ex.Message);return FindModule;}//得到程序集中所有的IAppDll接口兼容的累var ClassTypes = from t in asm.GetTypes()where t.IsClass &&(t.GetInterface("IAppDll") != null)select t;//创建对象,并调用类中的方法foreach (Type t in ClassTypes) {FindModule = true;//使用晚期绑定建立类型,强制转换为接口类型IAppDll someApp =(IAppDll)asm.CreateInstance(t.FullName, true);someApp.DoThing();listBox1.Items.Add(t.FullName);//显示插件的相关信息
                DisplayCarinfo(t);}return FindModule;}//显示插件的信息private void DisplayCarinfo(Type t) {var info = from carAtr in t.GetCustomAttributes(false)where (carAtr.GetType() == typeof(CarInfoAttribute))select carAtr;//显示特性的属性foreach (CarInfoAttribute cia in info) {MessageBox.Show(cia.name);            }}}
}

转载于:https://www.cnblogs.com/guoyuanwei/archive/2012/06/12/2545397.html

C#类型反射、晚期绑定、特性编程的使用背景与分析相关推荐

  1. 只知道java有反射可以说是动态语言,动态链接,早期晚期绑定、虚方法这些概念你知道吗

    目录 开局一张图 动态链接(或指向运行时常量池的方法引用) 为什么需要常量池呢? 早期绑定晚期绑定 静态链接 动态链接 虚方法与非虚方法 非虚方法 虚拟机中提供了以下几条方法调用指令 关于invoke ...

  2. 课工场-JAVA高级特性编程及实战第1章练习题3答案参考

    JAVA高级特性编程及实战第1章练习题3答案参考~ 本人菜鸟,一章章地学, 本想在网上搜一下然后对下答案的, 没找着~ 本着虔诚的心,把自己做的贴出来~ 运行结果是了出来了,过程不知道是否正确 欢迎大 ...

  3. 结构体前面加星号_C语言中带星号的类型指针有哪些特性

    C语言中带星号的类型指针有哪些特性 指针是什么?很多人说,指针就是地址,那这么说的人肯定是对指针有所了解,他们这么说也不能说全错,我只能在这里说:"他们并没有真正学会指针,如果想学好指针,请 ...

  4. 带你了解GDT陶瓷气体放电管的类型、优势、特性以及工作原理

    GDT陶瓷气体放电管,主要应用于一些计算机数据系统.通讯信号端口.以及对雷击浪涌防护有需求的电子设备.那么,对于它的类型.优势.特性以及工作原理,你了解过吗?接下来,就由优恩半导体小编给大家简单介绍一 ...

  5. 定义生产订单类型+不同订单类型关联不同的特性

    订单类型定义了订单的相关控制数据或信息,如成本控制.状态管理.滞留时间等,每个生产订单都必须输入订单类型. 双击任一订单类型,进入如下界面: 订单类别:订单类别代码,例如:生产订单.流程订单等,不可修 ...

  6. 并发编程——ConcurrentHashMap#transfer() 扩容逐行分析

    并发编程--ConcurrentHashMap#transfer() 扩容逐行分析 </h1><div class="clear"></div> ...

  7. Linux网络编程篇之ICMP协议分析及ping程序实现

    Linux网络编程系列: Linux网络编程篇之Socket编程预备知识 Linux网络编程篇之TCP协议分析及聊天室功能实现 如果对Linux网络编程,对socket通信不是太清楚的同学,强烈推荐看 ...

  8. 机器人离线编程软件市场现状研究分析报告-

    辰宇信息咨询市场调研公司最近发布-<2022-2028中国机器人离线编程软件市场现状研究分析与发展前景预测报告> 内容摘要 本文研究中国市场机器人离线编程软件现状及未来发展趋势,侧重分析在 ...

  9. 计算机程序设计的优缺点,事件驱动编程的概念与优缺点分析

    事件驱动编程开发是程序员在学习软件编程开发的时候需要重点掌握的一种开发方式,而今天我们就通过案例分析来了解一下,事件驱动编程的概念与优缺点分析. 1.事件驱动编程 事件驱动编程通常只是用一个执行过程, ...

最新文章

  1. 一个查看全部用户的磁盘空间使用情况的脚本
  2. CSS学习笔记--浮动元素由于浏览器页面缩小而被挤到下面的解决方法
  3. Python实现生成一个单词的圆形词云
  4. Eliminate Witches!【2011年北京赛区正赛赛题-2】
  5. 微软 PowerBI 被评为商业智能领导者-13年的企业产品奋斗史解读
  6. html的id不能有.吗,html – 哪些DOM元素不能接受id?
  7. HTTP 视频怎么在 MIP 页面中使用?
  8. 荣耀Magic 3渲染图曝光:超大主摄暗示顶级成像效果
  9. xcode高版本常见的RN本地启动报错
  10. python绘图-新增子区域
  11. Python之网络编程学习笔记
  12. 如何解决 Word 打印时内容缺失的问题?
  13. IP地址中的保留地址
  14. Checker框架学习笔记
  15. python九九乘法表如何对齐_python怎么样输出九九乘法表
  16. hualinux 编程概念 3.11 快速原型模型:以最快最小代价完成产品特性
  17. 3Dmax合并不同模型的UV和贴图
  18. 陷入苦战 台湾地区IT企业连续8个月减收
  19. R语言计算资本资产定价模型(CAPM)中的Beta值和可视化
  20. IEEE 802简介

热门文章

  1. 图解 | 线程的麻烦事儿,Actor能解决吗?
  2. 单日2000W+订单,如何忙中不错?美团外卖业务异常检测实践详解
  3. 怼天怼地怼空气的Linus 喜欢和什么样的人一起工作?
  4. 激进的中国技术选型,给世界技术的发展带来了什么?
  5. 聊聊 Spring Cloud Config
  6. Java线上应用故障排查之一:高CPU占用
  7. 常见数据归一化的几种方法
  8. 数据结构-冒泡排序最优代码(C语言)
  9. 轮播图js怎么设置图片自适应大小
  10. 奇安信为什么大量招人_券商招人鄙视链:985学历vs美本学历,究竟谁垫底?