【问题标题】:MEF Generic Class With Constructor as Type Contract构造函数作为类型协定的 MEF 泛型类
【发布时间】:2010-06-04 00:57:21
【问题描述】:

我有一个泛型类,它使用 TBase 作为类型参数。使用 MEF,我想要一个应该导入的通用类型列表。我试着用这个:

1)

[ImportMany(typeof(TBase))]
public List<TBase> ObjectList { get; set; }

2)  
Type IValueType = typeof(TBase)

[ImportMany(IValueType)]
public List<TBase> ObjectList{ get; set; }

3)
[ImportMany(TBase)]
public List<TBase> ObjectList{ get; set; }

首秀
{'TBase': an attribute argument cannot use type parameters}

第二场演出
{An object reference is required for the non-static field, method, or property}

第三场演出
{'TBase' is a 'type parameter' but is used like a 'variable'}

我在这里做错了什么?我该如何解决?

【问题讨论】:

    标签: c# generics mef


    【解决方案1】:

    试试following syntax

    [ImportMany]
    public IEnumerable<TBase> ObjectList{ get; set; }
    

    编辑第一个语法应该工作,因为[ImportMany(typeof(TBase))] 是一个合法的声明,ImportMany 确实接受了它的构造函数的类型/

    【讨论】:

    • 是的,如果 TBase 是一个通用参数,它在编译时是未知的,我不相信它会让您将该信息嵌入到属性中。但是,正如 Igor 指出的那样,您可以简单地离开 ImportMany 属性的值,这将导致 MEF 查看属性的类型以获取合同类型,在这种情况下,为对象实例构建到 TBase 的任何类型。但请记住,MEF 目前不支持开放泛型,因此为了使其显示在目录中,它必须是封闭的泛型类型。
    【解决方案2】:

    MEF 需要可在编译时转换为常量字符串的参数。 由于您使用的是通用的 TBase,并且只能在运行时实现,因此无法生成 MEF 元数据。 尝试使用非泛型接口而不是泛型类型 TBASE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-16
      • 1970-01-01
      • 2019-02-20
      • 2017-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多