C# MEF泛型类,构造函数作为合同类型

C# MEF泛型类,构造函数作为合同类型,c#,generics,mef,C#,Generics,Mef,我有一个泛型类,它使用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; }

我有一个泛型类,它使用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; }
1)
[进口数量(类型(TBase))]
公共列表对象列表{get;set;}
2)  
类型IValueType=typeof(TBase)
[进口数量(IValueType)]
公共列表对象列表{get;set;}
3)
[进口数量(待定)]
公共列表对象列表{get;set;}
第一个显示
{
'TBase':属性参数不能使用类型参数
}

第二个显示
{
非静态字段、方法或属性需要对象引用
}

第三个显示
{
'TBase'是一个“类型参数”,但与“变量”一样使用。
}

我做错了什么?如何修复它?

请尝试:

[ImportMany]
公共IEnumerable对象列表{get;set;}

EDIT第一个语法应该可以作为
[ImportMany(typeof(TBase))]
是一个合法的语句,并接受其构造函数的类型

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

是的,如果TBASE是一个泛型参数,它在编译时是未知的,我不相信它会让您将该信息嵌入到属性中。然而,正如Igor指出的,您可以简单地将ImportMany属性的值去掉,这将导致MEF查看属性的类型以获得契约类型,在这种情况下,无论对象实例的构建类型是什么。但是请记住,MEF当前不支持开放泛型,因此为了在目录中显示它,它必须位于封闭泛型类型上。
[ImportMany]
public IEnumerable<TBase> ObjectList{ get; set; }