- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个使用 MEF 的应用程序(特别是 MEF 2 Preview 5 ),我在尝试基于通用接口(interface)导入时遇到了问题。
我有一个界面:
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;
现在,这里是第一个问题 - 此时您被迫将类型分配给通用接口(interface)。我正在使用 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>
的类界面。我知道我可以简单地制作 IMessageHandler
非通用且有 IMessageHandler.HandleMessage()
接受 object
类型的参数但我正在寻找一个稍微更优雅的解决方案
欢迎任何指点或指导。
最佳答案
我看不出有更好的方法可以在不使用非通用接口(interface)的情况下完成您想要实现的目标。问题的根源是接口(interface)的定义:
public interface IMessageHandler<in T>
这意味着如果我们有两个类,A
和 B
,其中 B
派生自 A
,那么这是允许的
IMessageHandler<B> handler = new AHandler();
但这不是:
IMessageHandler<A> handler = new BHandler();
您实质上是在尝试执行后者,这是导致抛出异常的原因。我假设您想要做的是能够在给定类型的情况下获得处理程序。如果是这种情况,那么您可能应该使用非通用接口(interface),并在导出元数据中提供可用的消息类型。然后你会得到这样的东西:
public IMessageHandler GetHandler<T>()
{
Type handlerType = typeof(T);
return _messageHandlers.FirstOrDefault(x => x.Metadata.MessageType == handlerType);
}
您可能会发现 this question也相关。希望这会有所帮助。
关于c# - MEF - 具有通用接口(interface)和 Lazy<T, TMetadata> 的 ImportMany,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11106450/
几天来我一直在试图解决这个问题,但没有运气。 我正在尝试使用 [ImportMany] 从一个包含 IEditorSystem 类型导出的 DLL 目录中导入,该目录具有 IEditorSystemM
我在 MEF 中为 ImportMany 创建了自定义元数据属性,但 ImportMany 始终为空。 [MetadataAttribute] [AttributeUsage(AttributeTar
我刚刚接触 MEF,想知道如何定义使用 [ImportMany] 导出的集合的顺序? 我的意思是,如果我有两个实现接口(interface) IService 的类(Class1、Class2),并且
我正在使用 MEF 在构造函数中导入许多(带有元数据)。我已经按照视频教程尝试模仿它,但到目前为止它还不太奏效。简而言之,我重新命名了一些东西并进行了总结,但是: AbstractImportMe.c
我无法找到我的问题的答案。我正在使用 MEF 来查找和创建实现 IPlugIn 的类,但我最终得到了每个 PlugIn 类的两个版本。我已经确定 AggregateCatalog 仅包含一个程序集,该
我正在尝试在使用 MEF 加载一些插件的 WPF 应用程序上调试程序集导入问题,并寻找解决此特定异常的想法: More than one export was found that matches t
FooService.cs: public interface IFooService { int Foo(); } [Export("Foo1", typeof(IFooService))]
我遇到了以下问题: 在 MEF 上使用 ImportMany 属性时,MEF 始终至少会创建一个 IService 接口(interface)实现的实例。 因为我已经有一个现有的实例(通过在下面的代码
我是 MEF 的新手,想在我目前正在开发的项目中使用它。 想法:我想写一个FileLoader这需要 T作为我正在尝试加载的类型的参数,并为我提供有关支持将哪些文件扩展名加载到该类型中的数据。类型加载
我正在使用 MEF 来组合来自多个程序集的导出类型。我正在使用一个基类,它应该像派生类中指定的那样具有 ImportMany 依赖性。它看起来像这样: 基础组件: public abstract cl
我是 mef 的初学者,所以我有一个问题 :)我有以下内容: [PartCreationPolicy(CreationPolicy.Shared)] [Export(typeof(SharedExpo
我刚刚开始使用托管可扩展性框架。我有一个导出的类和一个导入语句: [Export(typeof(IMapViewModel))] [ExportMetadata("ID",1)] public cla
我刚刚在我的 mef 应用程序中发现了一个问题;问题是,我有一个 [Import]而不是 [ImportMany]在我的IEnumerable属性(property)。我开始想为什么。 MEF 看到注
我正在开发一个使用 MEF 的应用程序(特别是 MEF 2 Preview 5 ),我在尝试基于通用接口(interface)导入时遇到了问题。 我有一个界面: public interface IM
我是一名优秀的程序员,十分优秀!