我已经有了一些代码来加载程序集并获取所有实现特定接口的类型,如下所示(假设 asm 是一个有效和加载的程序集)。
var results = from type in asm.GetTypes()
where typeof(IServiceJob).IsAssignableFrom(type)
select type;
现在我陷入了困境:我需要创建这些对象的实例并调用对象的方法和属性。我还需要将创建的对象的引用存储在数组中以供以后使用。
我已经有了一些代码来加载程序集并获取所有实现特定接口的类型,如下所示(假设 asm 是一个有效和加载的程序集)。
var results = from type in asm.GetTypes()
where typeof(IServiceJob).IsAssignableFrom(type)
select type;
现在我陷入了困境:我需要创建这些对象的实例并调用对象的方法和属性。我还需要将创建的对象的引用存储在数组中以供以后使用。
哇哦 - 我只是几天前博客了这个。这里是我的方法,返回实现给定接口的所有类型的实例:
private static IEnumerable<T> InstancesOf<T>() where T : class
{
var type = typeof(T);
return from t in type.Assembly.GetExportedTypes()
where t.IsClass
&& type.IsAssignableFrom(t)
&& t.GetConstructor(new Type[0]) != null
select (T)Activator.CreateInstance(t);
}
如果你将其重构为接受一个装配参数而不是使用接口的组装,它就足够灵活,以满足您的需求。
你可以使用Activator.CreateInstance
方法创建一个类型的实例:-
IServiceJob x = Activator.CreateInstance(type);
那么您的代码变成:-
IServiceJob[] results = (from type in asm.GetTypes()
where typeof(IServiceJob).IsAssignableFrom(type)
select (IServiceJob)Activator.CreateInstance(type)).ToArray();
请将其翻译成中文:(请将var更改为IServiceJob[],以明确正在创建什么) 。