c# - 检索实现给定接口(interface)的对象列表

标签 c# generics architecture plugins interface

简介

我正在我的应用程序中构建插件架构。插件实现给定的接口(interface)IBasePlugin,或从基本接口(interface)继承的其他接口(interface):

interface IBasePlugin
interface IMainFormEvents : IBasePlugin

主机正在加载插件程序集,然后创建实现IBasePlugin接口(interface)的任何类的适当对象..

这是加载插件并实例化对象的类:

 public class PluginCore
 {
     #region implement singletone instance of class
     private static PluginCore instance;
     public static PluginCore PluginCoreSingleton
     {
         get
         {
             if (instance == null)
             {
                 instance = new PluginCore();
             }
             return instance;
         }
     }
     #endregion

     private List<Assembly> _PlugInAssemblies = null;
     /// <summary>
     /// Gets the plug in assemblies.
     /// </summary>
     /// <value>The plug in assemblies.</value>
     public List<Assembly> PlugInAssemblies
     {
         get
         {
             if (_PlugInAssemblies != null) return _PlugInAssemblies;

             // Load Plug-In Assemblies
             DirectoryInfo dInfo = new DirectoryInfo(
                 Path.Combine(
                     Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                     "Plugins"
                     )
                 );
             FileInfo[] files = dInfo.GetFiles("*.dll");
             _PlugInAssemblies = new List<Assembly>();
             if (null != files)
             {
                 foreach (FileInfo file in files)
                 {
                     _PlugInAssemblies.Add(Assembly.LoadFile(file.FullName));
                 }
             }

             return _PlugInAssemblies;
         }
     }

     List<IBasePlugin> _pluginsList = null;
     /// <summary>
     /// Gets the plug ins instances.
     /// all the plugins are being instanciated ONCE when this if called for the first time
     /// every other call will return the existing classes.
     /// </summary>
     /// <value>The plug ins instances.</value>
     public List<IBasePlugin> PlugInInstances
     {
         get
         {
             if (_pluginsList != null) return _pluginsList;

             List<Type> availableTypes = new List<Type>();

             foreach (Assembly currentAssembly in this.PlugInAssemblies)
                 availableTypes.AddRange(currentAssembly.GetTypes());

             // get a list of objects that implement the IBasePlugin
             List<Type> pluginsList = availableTypes.FindAll(delegate(Type t)
             {
                 List<Type> interfaceTypes = new List<Type>(t.GetInterfaces());
                 return interfaceTypes.Contains(typeof(IBasePlugin));
             });

             // convert the list of Objects to an instantiated list of IBasePlugin
             _pluginsList = pluginsList.ConvertAll<IBasePlugin>(delegate(Type t) { return Activator.CreateInstance(t) as IBasePlugin; });

             return _pluginsList;
         }
     }

问题

目前,任何支持插件的模块都使用 PlugInInstances 属性来检索 IBasePlugins 列表。然后它迭代查询谁正在实现给定子接口(interface)的对象。

foreach (IBasePlugin plugin in PluginCore.PluginCoreSingleton.PlugInInstances)
{
     if (plugin is IMainFormEvents)
     {
         // Do something
     }
 }

我想通过一个接收给定子接口(interface)的函数来改进这项技术,并返回这些接口(interface)的列表。问题是调用者中不应该进行类型转换。

伪代码:

void GetListByInterface(Type InterfaceType, out List<InterfaceType> Plugins)

您对如何实现这一点有建议吗?

最佳答案

你可以尝试这样的事情:

void GetListByInterface<TInterface>(out IList<TInterface> plugins) where TInterface : IBasePlugin
{
  plugins = (from p in _allPlugins where p is TInterface select (TInterface)p).ToList();
}

关于c# - 检索实现给定接口(interface)的对象列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1563282/

相关文章:

c# - ComboBox 中只允许不同的值

c# - 具有多种返回类型的方法

c# - 通用接口(interface)和多态性

java - java函数声明中<T, U extends T>的含义

java - Web 服务如何独立于 DAL 实现?

android - Android 开发的架构模式

c# - 如何在保持持久性无知的同时创建丰富的领域对象?

c# - 到 Azure VM 的 Web 部署失败

c# - 绑定(bind)Command时绑定(bind)IsEnabled是可选的吗?

c# - 使用属性使用Autofac创建委托(delegate)工厂