我想将泛型与MEF-“ [ImportMany(....))]”结合使用,但出现编译错误。
下面的代码不使用而没有使用常规的工作正常:工厂类“ HelperOneFactory”(见下文)正在搜索“ IHelperOne”接口的所有实现。从该列表中获取第一个没有元数据值“原始”的对象。如果不存在,那么它将在不检查Metadata-value的情况下获取第一个。
/// =====================================================================================
/// factory-implementation for interface-type "IHelperOne" (==> works fine)
/// =====================================================================================
[Export(typeof(HelperOneFactory))]
public class HelperOneFactory: IPartImportsSatisfiedNotification
{
[ImportMany(typeof(IHelperOne))]
private IEnumerable<Lazy<IHelperOne, Dictionary<string, object>>> Helper;
/// <summary>
/// reference to the relevant implementaion (HelperOneOriginal or HelperOneCusto)
/// </summary>
public IHelperOne Current { get; private set; }
/// <summary>
/// looking for all implementations of IHelperOne to find out the one to use
/// </summary>
public void OnImportsSatisfied()
{
Current = Helper.Count() > 1 ? Helper.First<Lazy<IHelperOne, Dictionary<string, object>>>(s => !s.Metadata.ContainsValue("Original")).Value :
Helper.First<Lazy<IHelperOne, Dictionary<string, object>>>().Value;
}
这很好,但是我必须为许多接口类型实现工厂类。因此,我尝试对接口类型使用泛型,但随后出现编译错误(使用.NET Framework 4.6.1):
/// =====================================================================================
/// a version with using generic ==> compiler-errors !!
/// =====================================================================================
[Export(typeof(HelperTemplateFactory<>))]
public class HelperTemplateFactory<THelperInterface> : IPartImportsSatisfiedNotification
{
[ImportMany(typeof(THelperInterface))] // ==> ERROR: "Attribute argument cannot use type parameters"
[ImportMany(THelperInterface)] // ==> also ERROR: "Type parameter name is not valid at this point"
private IEnumerable<Lazy<THelperInterface, Dictionary<string, object>>> Helper;
...
是否可以对“ ImportMany”命令使用通用类型?
问题背景:
“常规”类“ HelperOneOriginal”是HelperOne的标准版本,可以通过定义子类“ HelperOneCustom”将其覆盖在Custom-Projects中,该子类通常放置在单独的VisualStudio-Project中。 这两个类都有接口“ IHelperOne”。
主程序应使用Custom类(如果已定义),否则应使用Original类。原始类具有元数据信息“原始”。 因此,“ HelperOneFactory”将查找“ IHelperOne”-接口的所有实现,并获取第一个 没有 的元数据“原始”。 如果不存在,则采用原始类。对存储在HelperClass中的“ Class”成员中相关类ist的引用,供主程序使用。
如有必要,可以提供一个小的测试项目。
答案 0 :(得分:0)
我建议,我必须写一个“答案”来标记问题“已解决” =>
a line with only "[ImportMany]" is the solution!
感谢戴夫M