C#多态性 - 从DLL文件加载类

3
我收到了关于这个问题的回答,解决了我之前遇到的问题,但我想知道是否可以扩展它。例如,如果有第三方向该系统贡献命令,是否有办法将第一个答案扩展到允许从文件夹中加载所有DLL中的所有命令,然后在列表框中列出它们。
这是否可能?它能够与ICommand列表一起工作吗(就像对我之前的问题提供的答案建议的那样)?
2个回答

5
是的。
 Assembly commandAssembly = Assembly.Load("some/path")
 var commands = new List<ICommand>();

 foreach (Type type in commandAssembly.GetTypes())
 {
    if (type.GetInterface(typeof(ICommand).FullName) != null)
    {
       commands.Add((ICommand)Activator.CreateInstance(type));
    }
 }

然而,您可能会遇到有关程序集加载的一些限制。您不能从任何地方加载程序集,否则您可能会重新实现类似于 COM DLL Hell 的东西。


最佳实践是仅在子目录中加载程序集。 - Tom Anderson

1

您可以在目录中加载每个程序集,迭代每个程序集中公开的类,然后检查是否实现了您的ICommand。从那里,您可以通过创建这些对象的新实例将它们添加到内部系统中。

一些错误检查的地方:

  • 程序集加载,请确保它是CLR。
  • 构造:确保它不需要任何参数,并且具有公共构造函数。
  • 构造:确保它不是抽象类。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接