反射 学习笔记(五)构建可扩展的应用程序

构建可扩展的应用程序
如果可扩展的应用程序预编程为查询指定的接口,则它可以在运行时确定类型是否可以被激活。一旦验证测试通过,类型便可以支持额外的接口,为它们的功能提供多种结构。

示例:

目标:学习简单的接口编程过程,使用反射、特性将外部程序集在运行时加载到内存中并使用

第一步:新建解决方案

两个项目文件

MExtendableApp是主项目,CommonSnappableTypes是扩展项目(提供接口标准、公司信息描述、功能信息描述)

接下来,我们来写主项目

主界面非常简单

对Form进行初始化

首先,我们要在运行时加载第三方扩展插件,就要知道第三方插件所存的位置,这里我们在运行程序的同目录下新建一个文件夹用于存放第三方插件的程序集文件。程序集文件中并非所有的类都实现了接口IAppFunctionality,判断哪些第三方自定义类型实现了接口IAppFunctionality。

接下来,对实现了接口IAppFunctionality的类型进行操作:找到这些类中的DoIt方法,并获取定义在DoIt方法上的特性。将这些方法(在编写这些代码的时候无法知道第三方会定义什么样的类名,但可以使用里氏替换原则创建类型对象并以接口类型返回)。

最后,我们定义事件。这里有个非常值得注意的地方:如何在事件中创建类型对象,调用类型对象的方法呢?sender就是事件的发起者,也就是toolstripmenuitem,通过它的tag属性可以将接口类型对象传入事件,有了对象,就可以调用对象的方法了。

这样一个可扩展的应用程序就写好了。

接下来,我们做个第三方的应用进行测试。

这里的测试非常简单,首先,第三方公司从官网上下载扩展标准程序集文件,即,在解决方案文件夹中新增文件夹Reference,将程序集放入文件夹中,接下来就可以进行开发,记得先添加程序集文件。

时间: 2024-08-09 21:31:46

反射 学习笔记(五)构建可扩展的应用程序的相关文章

Android第一行代码学习笔记五---隐式Itent启动其它程序的活动

使用隐式Itent,不仅可以启动自己程序的活动,还可以启动其它程序的活动,这使得android多个应用程序之间的功能共享成为了可能,比如你的应用程序中需要展示一个网页,这时你没必要自己去实现一个浏览器,只需要调用系统的浏览器来打开这个网页就行了.修改firstActivity中点击按钮事件的代码,如下: button.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { Intent in

Caliburn.Micro学习笔记(五)----协同IResult

Caliburn.Micro学习笔记(五)----协同IResult 今天说一下协同IResult 看一下IResult接口 /// <summary> /// Allows custom code to execute after the return of a action. /// </summary> public interface IResult { /// <summary> /// Executes the result using the specif

java之jvm学习笔记五(实践写自己的类装载器)

java之jvm学习笔记五(实践写自己的类装载器) 课程源码:http://download.csdn.net/detail/yfqnihao/4866501 前面第三和第四节我们一直在强调一句话,类装载器和安全管理器是可以被动态扩展的,或者说,他们是可以由用户自己定制的,今天我们就是动手试试,怎么做这部分的实践,当然,在阅读本篇之前,至少要阅读过笔记三. 下面我们先来动态扩展一个类装载器,当然这只是一个比较小的demo,旨在让大家有个比较形象的概念. 第一步,首先定义自己的类装载器,从Clas

WEB前端学习笔记 五

接web前端学习笔记第四篇,此篇为web学习笔记 五,在此感谢您的采集和转发,但请注明文章出自网知博学. 2.0.3  html标签的属性格式 现在我们知道了两个双标签分别是,标题标签:<h1> - <h6>.和段落标签:<p></p>还知道了一个换行的单标签:<br />,现在我们给<p></p>标签添加一个属性,来改变段落是右对齐,还是左对齐,还是居中. 如上图,<p>标签中的 align(中文就是排列的意

jQuery源码学习笔记五 六 七 八 转

jQuery源码学习笔记五 六 七 八 转 Js代码   <p>在正式深入jQuery的核心功能选择器之前,还有一些方法,基本都是数组方法,用于遴选更具体的需求,如获得某个元素的所有祖选元素啦,等等.接着是其缓存机制data.</p> <pre class="brush:javascript;gutter:false;toolbar:false"> //@author  司徒正美|なさみ|cheng http://www.cnblogs.com/ru

laravel3学习笔记(五)

原作者博客:ieqi.net ==================================================================================================== 模型 在MVC模式的Web框架中,模型Model作为数据的抽象而存在,在Model层中,我们放置直接对数据的各种处理和操作,然后将抽象过的数据操作暴露为Model类给控制器,这样,在控制器中我们就不必拘泥于处理具体数据现实的各种细节中了,比如数据库如何连接,数据的类型

angular学习笔记(五)-阶乘计算实例(1)

<!DOCTYPE html> <html ng-app> <head> <title>2.3.2计算阶乘实例1</title> <meta charset="utf-8"> <script src="../angular.js"></script> <script src="script.js"></script> </

DuiLib学习笔记(二) 扩展CScrollbar属性

DuiLib学习笔记(二) 扩展CScrollbar属性 Duilib的滚动条滑块默认最小值为滚动条的高度(HScrollbar)或者宽度(VScrollbar).并且这个值默认为16.当采用系统样式的滚动条,或者 Troy的源码(https://github.com/qdtroy/DuiLib_Ultimate)自带的样式时,是没有问题的,因为这两种样式默认高(宽)度都是16,当滑块最小时,也有16*16,背景图片(九宫格式)不会出拉伸BUG.但是,当自定义背景图片时,如果图片本身大小超过16

NLTK学习笔记(五):分类和标注词汇

[TOC] 词性标注器 之后的很多工作都需要标注完的词汇.nltk自带英文标注器pos_tag import nltk text = nltk.word_tokenize("And now for something compleyely difference") print(text) print(nltk.pos_tag(text)) 标注语料库 表示已经标注的标识符:nltk.tag.str2tuple('word/类型') text = "The/AT grand/J