C#多态性-从DLL文件加载类
我的回答应该解决了我在那个问题上遇到的问题,但我想知道是否有可能把它扩展一点。例如,如果我让第三方向这个系统提供命令,是否有一种方法可以扩展我上一个问题的第一个答案,允许它加载文件夹中所有DLL中的所有命令,然后在列表框中列出它们C#多态性-从DLL文件加载类,c#,oop,dll,C#,Oop,Dll,我的回答应该解决了我在那个问题上遇到的问题,但我想知道是否有可能把它扩展一点。例如,如果我让第三方向这个系统提供命令,是否有一种方法可以扩展我上一个问题的第一个答案,允许它加载文件夹中所有DLL中的所有命令,然后在列表框中列出它们 可能吗?它是否能够处理ICommand列表(如我前面问题的答案所示)。您可以在目录中加载每个程序集,迭代程序集中每个公开的类,然后检查ICommand的实现。然后,您可以通过创建这些对象的新实例,将它们添加到您的内部系统中 用于错误检查的某些位置: 程序集加载,请确
可能吗?它是否能够处理ICommand列表(如我前面问题的答案所示)。您可以在目录中加载每个程序集,迭代程序集中每个公开的类,然后检查ICommand的实现。然后,您可以通过创建这些对象的新实例,将它们添加到您的内部系统中 用于错误检查的某些位置:
- 程序集加载,请确保它是CLR
- 构造:确保它不需要任何参数,并且具有公共构造函数
- 构造:确保它不是抽象类 是的
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));
}
}
Assembly commandAssembly=Assembly.Load(“一些/路径”)
var命令=新列表();
foreach(commandAssembly.GetTypes()中的类型)
{
if(type.GetInterface(typeof(ICommand.FullName)!=null)
{
Add((ICommand)Activator.CreateInstance(type));
}
}
但是,您可能会遇到一些有关程序集加载的限制。您不能只从任何地方加载程序集,否则您可以重新实现COM DLL地狱之类的东西。这种加载类型的最佳实践是只加载子目录中的程序集。