转自: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>委托,关于委托这里就不多说了,大家可以自行百度。

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

  1. @data 重写set方法_C#中的类、方法和属性

    这节讲C#中的类,方法,属性.这是面向对象编程中,我们最直接打交道的三个结构.    类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字 ...

  2. C# 子类实例化基类 基类使用不了子类的方法_C#中的类、方法和属性

    这节讲C#中的类,方法,属性.这是面向对象编程中,我们最直接打交道的三个结构.    类: 类(class)是面向对象中最基本的单元,它是一种抽象,对现实世界中事物的抽象,在C#中使用class关键字 ...

  3. Ajax→异步的JavaScript和XML、HTTP请求响应、Ajax简介同步异步、XMLHttpRequest类的方法及属性、原生Ajax、Koa实现Ajax、接口文档、浏览器同源策略、反向代理

    浏览器服务器 HTTP请求响应 数据库后端语言 Ajax简介同步异步 Koa前端框架 XMLHttpRequest类的方法及属性 原生Ajax Koa实现Ajax JSON DOM 接口文档 浏览器同 ...

  4. java中常用的包、类、以及包中常用的类、方法、属性----sql和text\swing

    java中常用的包.类.以及包中常用的类.方法.属性 常用的包 java.io.*; java.util.*; java.lang.*; java.sql.*; java.text.*; java.a ...

  5. java类的方法 作用 属性_JAVA:类和对象(秒懂版)

    JAVA:类和对象(秒懂版) 本节我们重点研究对象和类的概念. 1.现实生活中的对象和类. 对象: 一个具体的实体.一个具体的实例(不是抽象的,是具象的). 举例: 你写字的笔.我的电脑 描述我的电脑 ...

  6. java 获取类的注解_Java 自定义注解通过反射获取类、方法、属性上的注解

    反射 JAVA中的反射是运行中的程序检查自己和软件运行环境的能力,它可以根据它发现的进行改变.通俗的讲就是反射可以在运行时根据指定的类名获得类的信息. 注解的定义 注解通过 @interface 关键 ...

  7. JavaScript面向对象:类、方法、属性

    JavaScript是一种基于对象的语言,与传统面向对象语言(C#.C++)相比,JavaScript中没有类的概念,其继承有两种基本形式:基于对象的继承和基于类型的继承(原型链继承).无论哪种形式的 ...

  8. Java中final和static对修饰类、方法、属性的总结

    一.final        根据程序上下文环境,Java关键字final有"这是无法改变的"或者"终态的"含义,它可以修饰非抽象类.非抽象类成员方法和变量.你 ...

  9. Java中包、类、方法、属性、常量的命名规则

    1:包(package):用于将完成不同功能的类分门别类,放在不同的目录(包)下, 包的命名规则:对于包名:每个字母都需要小写. 将公司域名反转作为包名.比如www.baidu.com 比如:com. ...

最新文章

  1. 《深入浅出Google Android》即将隆重上市!
  2. 大开眼界!AI在医疗和汽车行业的11个有趣应用
  3. Mongodb 请求处理流程
  4. 如何在PowerPoint2007制造课件免费ppt模板下载
  5. 成功解决ValueError: With n_samples=0, test_size=0.3 and train_size=None, the resulting train set will be
  6. linux limit
  7. 【LeetCode笔记】剑指Offer 51. 数组中的逆序对(Java、分治)
  8. 【Flink】Flink各种UDF简介
  9. DeeCamp,(可能是)全球最好的 AI 夏令营
  10. requestAnimationFrame用法
  11. 中国游戏的未来在哪里 - 游戏行业20年历史观察及趋势分析
  12. Iris数据集免费下载
  13. windows 管理员权限编辑文件
  14. 遇见更好的自己 -- 90后农村姑娘非洲四年驻外生涯,和她的学渣“逆袭”川大的人生故事
  15. 计算机无法连接网络打印机,网络打印机无法连接怎么办 网络打印机无法连接教程【详解】...
  16. kubeadm部署1.11.1的k8s集群
  17. 所发生的分手快乐东风
  18. 使用Ubuntu自带Disks工具扩展(扩容 )Vmware中ubuntu 20.04的硬盘空间
  19. visual Studio Code(VS code)软件中HTML超级好用的一个插件 liveserver,vs code浏览网页
  20. 小红旗图标在excel如何输入_Excel用条件格式给数据插上小红旗

热门文章

  1. win32键盘输入python_python-win32api键盘输入教程
  2. cario java_Cairo图形库 概述
  3. 主流java框架理解
  4. php rpoplpush,RPOPLPUSH命令_视频讲解_用法示例-redis编程词典-php中文网
  5. php5 数据库框架,数据库 · FastAdmin - 基于ThinkPHP5的极速后台开发框架文档 · 看云...
  6. python去重语句_Python对列表去重的多种方法(四种方法)
  7. 互联网技术+非技术书单资源分享,都给泥萌!
  8. 【LeetCode笔记】64. 最小路径和(Java、动态规划)
  9. word手写字体以假乱真_Word小技巧|打印作文草稿纸
  10. distinct过滤掉重复记录并且显示所有字段_MySQL的所有姿势,我都帮你准备好了...