在 MEF 上下文中使用泛型
Using Generics in MEF-Context
我想结合 MEF-[ImportMany(....))] 使用泛型,但出现编译错误。
下面的代码没有使用泛型工作正常:工厂-class "HelperOneFactory"(见下文) 正在搜索 "IHelperOne" 接口的所有实现。它从这个列表中获取第一个没有元数据值 "Original" 的列表。如果不存在,则不检查元数据值就取第一个。
/// =====================================================================================
/// 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;
}
这很好用,但我必须为许多接口类型实现 factory-classes。所以我尝试使用 泛型作为接口类型 ,但随后出现编译错误(使用 .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" 命令使用通用类型?
问题上下文:
A "normal" class "HelperOneOriginal" 是 HelperOne 的标准版本,可以通过定义子 class "HelperOneCustom",通常放在一个单独的 VisualStudio 项目中。
两个 class 都有接口 "IHelperOne"。
如果已定义,主程序应使用自定义-class,否则应使用原始-class。原始-class 具有元数据信息"Orginal"。
因此 "HelperOneFactory" 查找 "IHelperOne"-Interfaces 的所有实现并获取第一个 without 元数据 "Original".
如果不存在,则采用 Original-class。对相关 class 的引用存储在成员 "Current" 的 HelperClass 中,供主程序使用。
如果需要,可以提供一个小的测试项目。
我建议,我必须写一个"answer"来标记问题 als "resolved" =>
a line with only "[ImportMany]" is the solution!
感谢 Dave M
我想结合 MEF-[ImportMany(....))] 使用泛型,但出现编译错误。
下面的代码没有使用泛型工作正常:工厂-class "HelperOneFactory"(见下文) 正在搜索 "IHelperOne" 接口的所有实现。它从这个列表中获取第一个没有元数据值 "Original" 的列表。如果不存在,则不检查元数据值就取第一个。
/// =====================================================================================
/// 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;
}
这很好用,但我必须为许多接口类型实现 factory-classes。所以我尝试使用 泛型作为接口类型 ,但随后出现编译错误(使用 .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" 命令使用通用类型?
问题上下文:
A "normal" class "HelperOneOriginal" 是 HelperOne 的标准版本,可以通过定义子 class "HelperOneCustom",通常放在一个单独的 VisualStudio 项目中。 两个 class 都有接口 "IHelperOne"。
如果已定义,主程序应使用自定义-class,否则应使用原始-class。原始-class 具有元数据信息"Orginal"。 因此 "HelperOneFactory" 查找 "IHelperOne"-Interfaces 的所有实现并获取第一个 without 元数据 "Original". 如果不存在,则采用 Original-class。对相关 class 的引用存储在成员 "Current" 的 HelperClass 中,供主程序使用。
如果需要,可以提供一个小的测试项目。
我建议,我必须写一个"answer"来标记问题 als "resolved" =>
a line with only "[ImportMany]" is the solution!
感谢 Dave M