前面說完了匯入和匯出的幾種方法,如果大家細心的話會注意到前面我們匯出的都是類,那麼方法和屬效能不能匯出呢???答案是肯定的,下面就來說下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高階進階