zoukankan      html  css  js  c++  java
  • C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

      前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下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>委托,关于委托这里就不多说了,大家可以自行百度。

    点击这里下载源码

    MEF系列文章:

     C#可扩展编程之MEF学习笔记(一):MEF简介及简单的Demo

    C#可扩展编程之MEF学习笔记(二):MEF的导出(Export)和导入(Import)

    C#可扩展编程之MEF学习笔记(三):导出类的方法和属性

    C#可扩展编程之MEF学习笔记(四):见证奇迹的时刻

    C#可扩展编程之MEF学习笔记(五):MEF高级进阶

  • 相关阅读:
    Session的使用与Session的生命周期
    Long-Polling, Websockets, SSE(Server-Sent Event), WebRTC 之间的区别与使用
    十九、详述 IntelliJ IDEA 之 添加 jar 包
    十八、IntelliJ IDEA 常用快捷键 之 Windows 版
    十七、IntelliJ IDEA 中的 Maven 项目初体验及搭建 Spring MVC 框架
    十六、详述 IntelliJ IDEA 创建 Maven 项目及设置 java 源目录的方法
    十五、详述 IntelliJ IDEA 插件的安装及使用方法
    十四、详述 IntelliJ IDEA 提交代码前的 Code Analysis 机制
    十三、IntelliJ IDEA 中的版本控制介绍(下)
    十二、IntelliJ IDEA 中的版本控制介绍(中)
  • 原文地址:https://www.cnblogs.com/yunfeifei/p/3927663.html
Copyright © 2011-2022 走看看