【发布时间】:2023-03-22 19:17:01
【问题描述】:
我正在开发一个启用 MEF 的应用程序。有一个核心库项目可以作为粘合剂并实现:
CompositionContainer cc = new CompositionContainer(catalog);
cc.ComposeParts(this);
我已经在这个核心库中声明了所有 [Import] 部分,如下所示:
[Import(typeof(IHost))]
// The imported host form
public IHost Host
{ get; set; }
[Import(typeof(ILightStudents<?>))]
public ILightStudents<?> StudentsAPI { get; set; }
在其他具有 [export] 属性的库项目中实现 IHost 或其他接口存在问题,但这里的问题是我已经像这样声明了 ILightStudents:
public interface ILightStudents<T> where T:class
{
IEnumerable<T> Students();
T GetStudent(long id);
}
但正如您在前面的代码中看到的,我输入了 '?'在导入部分标记。如您所知,泛型方法的目的是您可以通过您想要的任何类或类型来实现它们。在这里,我想在其他库项目中以我的正确类型实现 ILightStudents,但我不能在不指定类型的情况下离开 [import] 部分。
你能帮帮我吗?
已编辑:
我几乎可以通过使用动态类型绑定来解决这个问题。
【问题讨论】:
-
我能想到的唯一可以形成 > 的地方是类上的类型参数,该类包含 StudentAPI 属性。因为这个类不是你的插件知道的东西(是吗?)插件现在有办法为它导出实现。我想知道您在导出方面设想的功能是什么?
-
导出端实现了两种方法。第一个返回学生列表,第二个获取一个学生的 id 并返回她/他的信息。收集所有 dll 文件以获取导出的核心库不知道“?”的类型是什么。可能。我还为 '?' 使用了 'object' 类型,但它不起作用并给了我这个错误:“导出 'StudentsModule.DAL.StudentsAPI (ContractName="SabteNamCore.Interfaces.ILightStudents")' 不能分配给类型 ' SabteNamCore.Interfaces.ILightStudents'。”
-
.NET 4.0 的 MEF 不支持泛型。它已被添加到 .NET 4.5 中的 MEF 2 中,因此请等待它或获取预览。
-
这解释了为什么它不起作用 - codebetter.com/glennblock/2009/03/21/…