实例化实现通用接口实例的所有类

福斯科

我有一个通用接口的层次结构,其中每个接口都与关联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 { ... }

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

我尝试过:

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类的一个实例然后,我将使用反射来导航对象,以查看它们使用什么泛型类型。

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

Where子句不应检查通用类型,因为您的类GreaterThanOperator等本身不是通用类。另外,IOperator<,>不是你的类型的定义:它是由它实现的接口之一的类型定义。

这是执行选择的方法:

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();

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章