C# 如何使用从程序集动态加载的接口并调用其成员

C# 如何使用从程序集动态加载的接口并调用其成员,c#,reflection,interface,assemblies,pinvoke,C#,Reflection,Interface,Assemblies,Pinvoke,我有一些代码来加载一个程序集并获取所有类型,它们实现了一个特定的接口,就像这样(假设asm是一个有效且加载的程序集) 现在我陷入困境:我需要创建这些对象的实例,并调用对象上的方法和属性。我需要将对已创建对象的引用存储在一个数组中,以备日后使用。噢,哇,我几天前才知道。下面是我返回实现给定接口的所有类型实例的方法: private static IEnumerable<T> InstancesOf<T>() where T : class { var type =

我有一些代码来加载一个程序集并获取所有类型,它们实现了一个特定的接口,就像这样(假设asm是一个有效且加载的程序集)

现在我陷入困境:我需要创建这些对象的实例,并调用对象上的方法和属性。我需要将对已创建对象的引用存储在一个数组中,以备日后使用。

噢,哇,我几天前才知道。下面是我返回实现给定接口的所有类型实例的方法:

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);
}
private static IEnumerable InstancesOf(),其中T:class
{
var类型=类型(T);
从type.Assembly.GetExportedTypes()中的t返回
t.IsClass在哪里
&&类型。IsAssignableFrom(t)
&&t.GetConstructor(新类型[0])!=null
选择(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[]以明确创建的对象)。

您尚未明确需要调用的“方法和属性”是任意的还是IServiceJob接口的成员。请记住,如果实现类型没有默认的构造函数,则此代码将抛出MethodMissingException。因此,在我的查询中进行了检查。@Matt Hamilton:那么是否可以以没有默认空构造函数的方式调用构造函数?@Matt Hamilton:那么是否可以以没有默认空构造函数的方式调用构造函数?Activator.CreateInstance有一个重载,它可以接受传递给您正在实例化的类的ctor,但我认为没有任何方法可以在一个查询中使用它,就像我在这里发布的查询一样。
IServiceJob[] results = (from type in asm.GetTypes()
  where typeof(IServiceJob).IsAssignableFrom(type)
  select (IServiceJob)Activator.CreateInstance(type)).ToArray();