c# MEF框架(三 导出类的方法和属性)

转自:http://www.cnblogs.com/yunfeifei/p/3927663.html

前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下MEF是如何导出方法和属性的。

  还是前面的代码,第二篇中已经提供了下载链接,大家可以下载学习。

  首先来说导出属性,因为这个比较简单,和导出类差不多,先来看看代码,主要看我加注释的地方,MusicBook.cs中的代码如下:

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;namespace MEFDemo
{[Export("MusicBook")]public class MusicBook : IBookService{//导出私有属性[Export(typeof(string))]private string _privateBookName = "Private Music BookName";//导出公有属性[Export(typeof(string))]public string _publicBookName = "Public Music BookName";public string BookName { get; set; }}[Export("MathBook", typeof(IBookService))]public class MathBook : IBookService{public string BookName { get; set; }public string GetBookName(){return "MathBook";}}[Export("HistoryBook", typeof(IBookService))]public class HistoryBook : IBookService{public string BookName { get; set; }public string GetBookName(){return "HistoryBook";}}}
复制代码

program.cs中的代码如下:

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;namespace MEFDemo
{class Program{[ImportMany("MathBook")]public IEnumerable<object> Services { get; set; }//导入属性,这里不区分public还是private
      [ImportMany]public List<string> InputString { get; set; }static void Main(string[] args){Program pro = new Program();pro.Compose();if (pro.Services != null){foreach (var s in pro.Services){var ss = (IBookService)s;Console.WriteLine(ss.GetBookName());}}foreach (var str in pro.InputString){Console.WriteLine(str);}Console.Read();}private void Compose(){var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());CompositionContainer container = new CompositionContainer(catalog);container.ComposeParts(this);}}
}
复制代码

下面还用foreach遍历输出属性的值,运行即可查看到结果。最后我会附上源码供大家下载,这里就不再截图了。

下面说导出方法吧,同理无论是公有方法还是私有方法都是可以导出的,MusicBook代码如下:

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel.Composition;namespace MEFDemo
{[Export("MusicBook")]public class MusicBook : IBookService{//导出私有属性[Export(typeof(string))]private string _privateBookName = "Private Music BookName";//导出公有属性[Export(typeof(string))]public string _publicBookName = "Public Music BookName";public string BookName { get; set; }//导出公有方法[Export(typeof(Func<string>))]public string GetBookName(){return "MusicBook";}//导出私有方法[Export(typeof(Func<int, string>))]private string GetBookPrice(int price){return "$" + price;}}[Export("MathBook", typeof(IBookService))]public class MathBook : IBookService{public string BookName { get; set; }public string GetBookName(){return "MathBook";}}[Export("HistoryBook", typeof(IBookService))]public class HistoryBook : IBookService{public string BookName { get; set; }public string GetBookName(){return "HistoryBook";}}}
复制代码

program中的代码如下:

复制代码
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Reflection;
using System.ComponentModel.Composition;
using System.ComponentModel.Composition.Hosting;namespace MEFDemo
{class Program{[ImportMany("MathBook")]public IEnumerable<object> Services { get; set; }//导入属性,这里不区分public还是private
      [ImportMany]public List<string> InputString { get; set; }//导入无参数方法
      [Import]public Func<string> methodWithoutPara { get; set; }//导入有参数方法
      [Import]public Func<int,string> methodWithPara { get; set; }static void Main(string[] args){Program pro = new Program();pro.Compose();if (pro.Services != null){foreach (var s in pro.Services){var ss = (IBookService)s;Console.WriteLine(ss.GetBookName());}}foreach (var str in pro.InputString){Console.WriteLine(str);}//调用无参数方法if (pro.methodWithoutPara != null){Console.WriteLine(pro.methodWithoutPara());}//调用有参数方法if (pro.methodWithPara != null){Console.WriteLine(pro.methodWithPara(3000));}Console.Read();}private void Compose(){var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());CompositionContainer container = new CompositionContainer(catalog);container.ComposeParts(this);}}
}
复制代码

导入导出方法用到了Func<T>委托,当然没有返回值的话可以用Action<T>委托,关于委托这里就不多说了,大家可以自行百度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/509263.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c# MEF框架(四 见证奇迹的时刻之实战应用)

转自 http://www.cnblogs.com/yunfeifei/p/3940075.html 前面三篇讲了MEF的基础和基本到导入导出方法&#xff0c;下面就是见证MEF真正魅力所在的时刻。如果没有看过前面的文章&#xff0c;请到我的博客首页查看。 前面我们都是在一个项目中写了一个类来测试的&#xff0c;但实…

c# MEF框架(四 MEF高级进阶)

转自&#xff1a;http://www.cnblogs.com/yunfeifei/p/3991330.html 好久没有写博客了&#xff0c;今天抽空继续写MEF系列的文章。有园友提出这种系列的文章要做个目录&#xff0c;看起来方便&#xff0c;所以就抽空做了一个&#xff0c;放到每篇文章的最后。 前面四篇讲了MEF的…

Unity3D求向量间的夹角

如下图 Vector3 srcPos new Vector3(0,0,0);Vector3 tarPos new Vector3(0,0,-1);Vector3 srcRot new Vector3(0,90,0);Quaternion srcQua Quaternion.Euler(srcRot);Vector3 direction tarPos - srcPos;Vector3 r Quaternion.Inverse(srcQua) * direction;Debug.Log(r);…

面向切面编程--AOP

转自:https://www.cnblogs.com/qicosmos/archive/2013/04/07/3003480.html &#xff08;原创&#xff09; C 轻量级AOP框架 c11 boost技术交流群&#xff1a;296561497&#xff0c;欢迎大家来交流技术。 c中开源的AOP框架AspectC需要单独编译才能将切面的代码织入到核心逻辑代码…

面向切面编程--AOP(二)

转自&#xff1a;http://www.cnblogs.com/qicosmos/p/3154174.html (原创)c11改进我们的模式之改进代理模式&#xff0c;实现通用的AOP框架 c11 boost技术交流群&#xff1a;296561497&#xff0c;欢迎大家来交流技术。 本次要讲的时候如何改进代理模式&#xff0c;具体来说是动…

VS2013+VSVIM

上世纪90年代后期出现了一股.com热潮&#xff0c;相信大家对其都有美好的回忆&#xff0c;那时使用CGI和Perl创建“动态的”网站&#xff0c;通过使用在Unix上的vi编辑器快速打字和格式化&#xff0c;这也包括后来使用的vi的复制版本vim。我可能是怀旧的&#xff0c;但我想念将…

一个程序员的日常书单

本想谈谈读书这个话题,想来想起觉得无从下手,就此作罢.毕业这几年,一直不敢放松,在现代这个互联网时代更加认同萧抡谓的”一日不读书,胸臆无佳想;一月不读书,耳目失清爽”.如果非要给自己找个读书的理由的话,这句诗就是最好的理由:”胸藏文墨虚若骨,腹有诗书气自华”. 与书结缘…

Amr and Pins

Description Amr loves Geometry. One day he came up with a very interesting problem. Amr has a circle of radius r and center in point (x, y). He wants the circle center to be in new position (x, y). In one step Amr can put a pin to the border of the circl…

分布式系统的工程化开发方法

转自&#xff1a;http://blog.csdn.net/solstice/article/details/5950190 以下是我在珠三角技术沙龙 2010Q4 上的演讲投影片。 演讲视频&#xff1a; http://www.youku.com/playlist_show/id_5238686.html ---------- ---------- ------

程序员的知识广度

转自&#xff1a;http://blog.csdn.net/EGEFCXzo3Ha1x4/article/details/79070190 “知识变现”的口号一喊 确实让很多人都摩拳擦掌蓄势待发 那么作为程序员的mu们 不管是思维逻辑&#xff0c;还是知识广度 是不是都迫不及待了 今天&#xff0c;我们也来测试下 【单选题】 1 …

多线程---条件变量

互斥器和条件变量的区别&#xff1a;互斥器具有加锁原语&#xff0c;用来进行排他性的访问共享数据&#xff0c;而条件变量具有等待原语&#xff0c;用于等待某个事件的发生。 等待条件变量的正确姿势&#xff1a; void wait() {mutex.lock()while (wait_flag false) {conditi…

ARP-地址解析协议(在实践中深入理解ARP协议)

在同一个网络&#xff08;无特别说明&#xff0c;均指以太网络&#xff09;中进行通信的主机&#xff0c;必须要拥有目标主机的MAC地址才能够正确地将数据发送给目标主机&#xff0c;那么如何知道目标主机的MAC地址呢&#xff1f;可以通过ARP协议。ARP协议就是用来获取目标IP地…

Maven私服

1 Maven私服简介 Maven 私服是一种特殊的Maven远程仓库&#xff0c;它是架设在局域网内的仓库服务&#xff0c;用来代理位于外部的远程仓库&#xff08;中央仓库、其他远程公共仓库&#xff09;。 1.1 下载构件顺序 建立私服后&#xff0c;当局域网内的用户需要某个构件时&a…

Unity3d--跨平台(一)

转自&#xff1a;https://www.cnblogs.com/murongxiaopifu/p/4211964.html前言&#xff1a; 其实小匹夫在U3D的开发中一直对U3D的跨平台能力很好奇。到底是什么原理使得U3D可以跨平台呢&#xff1f;后来发现了Mono的作用&#xff0c;并进一步了解到了CIL的存在。所以&#xff0…

linux定时任务的用法详解

crontab的基本格式&#xff1a; f1  f2  f3  f4  f5  command 分  时 日  月  周  命令 第一列f1代表分钟1~59&#xff1a;当f1为表示每分钟都要执行&#xff1b;为/n表示每n分钟执行一次&#xff1b;为a-b表示从第a分钟到第b分钟这段时间要执行&#xff1b;为a,…

Unity3d-跨平台(二)

转自&#xff1a;http://www.jiandaima.com/blog/archives/945.html 是如何输出到多平台的&#xff1f; 我的第一篇文章&#xff0c;选择了一个不那么简单的主题&#xff0c;但是是我近期比较感兴趣的。这周&#xff0c;我和一个朋友&#xff0c;谈到了游戏开发和Unity3D&#…

svn冲突解决方案

解决方法 步骤一、清空svn的队列 1、进入到项目的.svn目录中&#xff0c;查看是否存在wc.db文件 C:\Users\Administrator>D:D:\>cd D:\BBK_SVN\I3_TrunkD:\BBK_SVN\I3_Trunk>cd .svnD:\BBK_SVN\I3_Trunk\.svn>dirVolume in drive D has no label.Volume Serial Nu…

redis集群搭建与配置

redis集群搭建与配置

keepalived的安装与添加服务

keepalived的安装与添加服务

Mr. Bender and Square

Description Mr. Bender has a digital table of size n  n, each cell can be switched on or off. He wants the field to have at least c switched on squares. When this condition is fulfilled, Mr Bender will be happy. Well consider the table rows numbered from…