假设我们有几个程序集,它们都实现了IAnimal,我们想去一个地方找出其他IAnimal实现的存在。
特点:
我们不希望在集会之外进行预知识
程序集中可能有一个注册类/方法
使用反射最好不。到目前为止,这似乎是唯一的方法
讨论:
我想通过继承静态地做这个,但是,我不知道汇编级初始化序列。
答案 0 :(得分:6)
我建议看看MEF。它实际上是为这种东西而设计的。
它确实使用了反射,因为这是为这种动态发现创建的机制。我怀疑你会找到一个不使用某种程度反射的解决方案。
答案 1 :(得分:1)
我写了an extension method,它允许您查找在运行时符合某些条件的已部署类型 - 它确实使用了Reflection,但您可能会发现它很有用。
IEnumerable<Type> animalTypes = Assembly.GetExecutingAssembly()
.GetAvailableTypes(
typeFilter: t => !t.IsInterface && typeof(IAnimal).IsAssignableFrom(t));
答案 2 :(得分:1)
启动应用程序时,您可以注册到AppDomain的AssemblyLoad:
AppDomain.CurrentDomain.AssemblyLoad += new AssemblyLoadEventHandler(NewAssemblyLoaded);
并定义NewAssemblyLoad以将IAnimal实现添加到您维护的类型列表(例如animalTypes)中:
static void NewAssemblyLoaded(object sender, AssemblyLoadEventArgs args)
{
Assembly anAss = args.LoadedAssembly;
foreach (Type t in Assembly.GetTypes())
{
if (!t.IsInterface && typeof(IAnimal).IsAssignableFrom(t))
animalsList.Add(t);
}
}