English 中文(简体)
如何使用从程序集动态加载的接口并调用其成员
原标题:
  • 时间:2008-11-11 10:48:31
  •  标签:

我已经有了一些代码来加载程序集并获取所有实现特定接口的类型,如下所示(假设 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[],以明确正在创建什么) 。





相关问题
热门标签