MEF導出類的方法和屬性 首先來說導出屬性,因為這個比較簡單,和導出類差不多,先來看看代碼,主要看我加註釋的地方,MusicBook.cs中的代碼如下: program.cs中的代碼如下: 下麵還用foreach遍歷輸出屬性的值,運行即可查看到結果。最後我會附上源碼供大家下載,這裡就不再截圖了。 下 ...
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>委托,關於委托這裡就不多說了,大家可以自行百度。