使用MEF中的通用接口
本文关键字:接口 MEF 使用 | 更新日期: 2023-09-27 18:25:22
我正在开发一个启用了MEF的应用程序。有一个核心库项目可以作为粘合剂并实现:
CompositionContainer cc = new CompositionContainer(catalog);
cc.ComposeParts(this);
我已经在这个核心库中声明了所有[导入]零件,如下所示:
[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]部分。
你能帮我吗?
编辑:
我几乎可以通过使用动态类型绑定来解决这个问题。
几天前我从另一个线程复制了答案:
尝试
[Export(typeof(IService<>))]
要从typeof运算符获得泛型类型定义,可以省略类型参数。对于具有多个类型参数的类型,请使用逗号表示该类型的"arity"。例如:
typeof(List<>) // not: typeof(List<T>)
typeof(IDictionary<,>) // not: typeof(IDictionary<K, V>)
使用其中之一:
- MefContrib或
- MEF 2预览
这项功能在两者中都添加了,它将包含在.NET 4.5中。