在MEF中使用通用接口

时间:2012-02-22 18:18:28

标签: c# .net mef

我正在开发一个支持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]部分而不指定类型。

请你帮帮我吗?

被修改

我几乎可以通过使用动态类型绑定来解决问题。

2 个答案:

答案 0 :(得分:2)

使用:

  • MefContrib中的代码或
  • MEF 2预览。

此功能已添加到两者中 - 它将包含在.NET 4.5中。

答案 1 :(得分:2)

我几天前从另一个帖子中复制了答案:

尝试

[Export(typeof(IService<>))]

要从typeof运算符获取泛型类型定义,请省略类型参数。对于具有多个类型参数的类型,请使用逗号表示该类型的“arity”。例如:

typeof(List<>)              // not: typeof(List<T>)
typeof(IDictionary<,>)      // not: typeof(IDictionary<K, V>)