实例化所有实现通用接口实例的 类
Instantiate all classes that implement an instance of a generic interface
我有一个通用接口层次结构,其中每个接口都与 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>
我有很多 classes(不是通用的)实现了这些接口中的一个或多个,例如:
class GreaterThanOperator :
IComparisonOperator,
IComparisonOperator<decimal>,
IComparisonOperator<DateTime>,
IComparisonOperator<DateTime, string>
{ ... }
class EqualComparator: IOperator
class RegexOperator : IMatchingOperator { ... }
现在,我想要创建一个工厂,它可以加载和实例化程序集中的每个 class,以某种方式实现父接口 "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
class 的一个实例。
然后我将使用反射导航对象以查看它们使用的泛型类型。
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();
我有一个通用接口层次结构,其中每个接口都与 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>
我有很多 classes(不是通用的)实现了这些接口中的一个或多个,例如:
class GreaterThanOperator :
IComparisonOperator,
IComparisonOperator<decimal>,
IComparisonOperator<DateTime>,
IComparisonOperator<DateTime, string>
{ ... }
class EqualComparator: IOperator
class RegexOperator : IMatchingOperator { ... }
现在,我想要创建一个工厂,它可以加载和实例化程序集中的每个 class,以某种方式实现父接口 "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
class 的一个实例。
然后我将使用反射导航对象以查看它们使用的泛型类型。
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();