如何在程序集中搜索实现所需通用接口的类型

时间:2019-04-16 10:32:50

标签: c# reflection interface immediate-window

我正在搜索程序集以标识实现所需通用接口的任何类,以便可以动态实例化实例。这是我正在使用的代码:

var types = assembly.GetTypes();
var assemblyFormatters = types.Where(type => type.GetInterfaces().Any(i => 
   i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IInterface<>)));

该代码适用于标准类:

public class Implementation : IInterface<object>

但不是通用类:

public class GenericImplementation<T> : IInterface<T>

事件陌生人,代码在中间窗口中运行时可以成功运行,但在单元测试框架中运行时则无法运行。立即窗口返回两种类型,在调试器下运行的测试代码仅返回非通用实现。

我希望两种类型的代码都可以返回

1 个答案:

答案 0 :(得分:0)

原来是程序集存在问题。我正在使用以下程序加载程序集:

var path = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
foreach (var assembly in Directory.GetFiles(path, "*.dll"))
{
    Assembly.LoadFile(assembly);
}

将加载的程序集与Assembly.GetExecutingAssembly()比较时,程序集不相等。由于类型引用了它们各自的程序集,因此类型不相等。转而使用AppDomain.CurrentDomain.GetAssemblies()解决了这个问题,因为我正在加载应用程序已经加载的程序集。