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

2021-05-02 03:28

阅读:698

标签:service   类的方法   his   catalog   没有   action   可扩展   foreach   new   

前面说完了导入和导出的几种方法,如果大家细心的话会注意到前面我们导出的都是类,那么方法和属性能不能导出呢???答案是肯定的,下面就来说下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 Services { get; set; }

      //导入属性,这里不区分public还是private
      [ImportMany]
      public List 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))]
      public string GetBookName()
      {
         return "MusicBook";
      }

      //导出私有方法
      [Export(typeof(Func))]
      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 Services { get; set; }

      //导入属性,这里不区分public还是private
      [ImportMany]
      public List InputString { get; set; }

      //导入无参数方法
      [Import]
      public Func methodWithoutPara { get; set; }

      //导入有参数方法
      [Import]
      public Func 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委托,当然没有返回值的话可以用Action委托,关于委托这里就不多说了,大家可以自行百度。

点击这里下载源码

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

标签:service   类的方法   his   catalog   没有   action   可扩展   foreach   new   

原文地址:http://www.cnblogs.com/jia125go/p/7771761.html


评论


亲,登录后才可以留言!