我正在研究MEF2。下面的代码引发以下异常: 调用SatisfyImports()方法时。为什么?using System;using System.Collections.Generic;using System.Composition;using System.Composition.Hosting;using System.Reflection;namespace MEFStudy{ class Program { static void Main(string[] args) { Program p = new Program(); p.Run(); } [ImportMany] private List<IMessageSender> MessageSenders { get; set; } public void Run() { Compose(); foreach (IMessageSender sender in MessageSenders) { sender.Send(); } } private void Compose() { CompositionHost host = new ContainerConfiguration().WithAssembly(Assembly.GetExecutingAssembly()).CreateContainer(); host.SatisfyImports(this); // <=========== HERE host.Dispose(); } } public interface IMessageSender { void Send(); } [Export(typeof(IMessageSender))] public class EmailSender1 : IMessageSender { public void Send() { Console.WriteLine("EmailSender1"); } } [Export(typeof(IMessageSender))] public class EmailSender2 : IMessageSender { public void Send() { Console.WriteLine("EmailSender2"); } }}更新1根据here,有2个版本的MEF。 .NET Framework附带的不可移植的一种 nut_li上可使用的便携式版本List<IMessageSender>方法适用于非便携式方法。但不是随身携带的。这是一个错误吗? 最佳答案 我不小心更改了以下代码:[ImportMany]private List<IMessageSender> MessageSenders { get; set; }至[ImportMany]private IEnumerable<IMessageSender> MessageSenders { get; set; }它解决了这个问题。但是,为什么呢? List<T>不是IEnumerable<T>吗?添加甚至更陌生,我将IEnumerable更改为IList,它可以工作。为什么?可能的解释(我想对此分享我的解释。)以下接口(interface)可以重现完全相同的错误。interface IMyList<T> : IList<T>{}[System.Composition.ImportMany] // MEF 2private IMyList<IMessageSender> MessageSenders { get; set; }以下MEF 2来源显示了原因。3个SupportedContactTypes的Equals()方法使用IMyList 返回false。因此,在MEF2中,不会为IMyList 返回有效的导出。并且MEF 2不允许使用[ImportMany]属性修饰的属性的默认值。因此,在以下逻辑中,将抛出缺少依赖项的异常。因此可以说,ImportMany属性仅支持数组和3种受支持的泛型类型。
10-07 15:54