【问题标题】:Instantiate all classes that implement an instance of a generic interface实例化所有实现泛型接口实例的类
【发布时间】:2017-09-03 22:20:47
【问题描述】:

我有一个通用接口层次结构,其中每个接口都与IOperator<T1,T2> 相关。

interface IOperator<T1, T2>
{
    Func<T1, T2, bool> GetFunc()
}

IOperator : IOperator<object, object>

interface IMatchingOperator : IOperator<string, string> { }


interface IComparisonOperator<T1, T2> : IOperator<T1, T2>
    where T1: IComparable<T2> { }

interface IComparisonOperator<T> : IComparisonOperator<T, T>
    where T: IComparable<T> { }

interface IComparisonOperator : IComparisonOperator<IComparable, object>

我有很多实现一个或多个这些接口的类(非泛型),例如:

class GreaterThanOperator : 
    IComparisonOperator,
    IComparisonOperator<decimal>,
    IComparisonOperator<DateTime>,
    IComparisonOperator<DateTime, string>
{ ... }

class EqualComparator: IOperator

class RegexOperator : IMatchingOperator { ... }

现在,我想要创建一个工厂,它可以加载和实例化程序集中以某种方式实现父接口“IOOperator”的每个类,并将其放入集合中。

我试过了:

AppDomain.CurrentDomain.GetAssemblies()
              .SelectMany(x => x.GetTypes())
              .Where(
                  x => x.IsGenericType 
                  && x.GetGenericTypeDefinition() == typeof(IOperator<,>) 
                  && !x.IsInterface && !x.IsAbstract))
              .Select(x => Activator.CreateInstance(x)).ToList();

但它不起作用。

我希望最终列表包含每个 IOperator 类的一个实例。 然后,我将使用反射导航对象以查看它们使用的泛型类型。

【问题讨论】:

  • 第一个问题,你为什么要这么做,看起来你在寻找Lazy loading技术。
  • 这将在工厂的静态构造函数中运行。原因是我想知道所有存在的运算符。我将如何实现延迟加载方法?
  • 您可以在需要时实例化类型,如果需要,还可以将它们缓存在静态属性中。

标签: c# .net generics reflection .net-assembly


【解决方案1】:

Where 子句不应检查泛型类型,因为您的类 GreaterThanOperator 等本身不是泛型类。此外,IOperator&lt;,&gt;不是您的类型的定义:它是由它实现的接口之一的类型定义。

以下是执行选择的方法:

var res = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(x => x.GetTypes())
    .Where(x =>
        !x.IsAbstract
    &&  !x.IsInterface
    &&  x.GetInterfaces().Any(i =>
            i.IsGenericType()
        &&  i.GetGenericTypeDefinition() == typeof(IOperator<,>)
        )
    ).Select(x => Activator.CreateInstance(x)).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2020-06-11
    相关资源
    最近更新 更多