我正在使用 MEF(特别是MEF 2 Preview 5)开发应用程序,并且在尝试基于通用接口导入时遇到了问题。
我有一个界面:
public interface IMessageHandler<in T>
{
void HandleMessage(T message);
}
其中 T 是要处理的消息类型。我正在使用以下方法将这些东西导入目录RegistrationBuilder
:
RegistrationBuilder context = new RegistrationBuilder();
context.ForTypesDerivedFrom(typeof(IMessageHandler<>))
.Export(builder => builder.AsContractType(typeof(IMessageHandler<>)));
然后,在我[ImportMany]
用来将这些列表导入到的消费类中IEnumerable<Lazy>>
:
[ImportMany(typeof(IMessageHandler<>))]
IEnumerable<Lazy<IMessageHandler<object>, HandledMessageTypeAttribute>> _messageHandlers;
现在,这是第一个问题——此时您被迫为泛型接口分配一个类型。我正在使用Lazy<T, TMetadata>
,因为IMessageHandler<T>
实现具有我想要使用的相关元数据(HandledMessageTypeAttribute
)。
现在,当我想访问IEnumerable<Lazy<>>
集合中的任何元素时,我得到以下异常:
Cannot cast the underlying exported value of type
'MessageHandlerImplementation (ContractName="IMessageHandler(System.Object)")'
to type 'IMessageHandler`1[System.Object]'.
我(大致)理解为什么我会遇到异常,问题是我不知道如何解决它。所以,基本上我想做的是:
- 有一堆实现
IMessageHandler<T>
接口的类。 - 使用 MEF 在运行时发现它们。
- 将它们导入到一个集合中,这样我就可以使用它们拥有的任何元数据。
- 能够实例化它们。
我知道我可以简单地制作IMessageHandler
非泛型并IMessageHandler.HandleMessage()
接受类型参数,object
但我正在寻找一个更优雅的解决方案
任何指针或指导表示赞赏。