从派生接口列表中选择类

  • 本文关键字:选择 列表 派生 接口 c#
  • 更新时间 :
  • 英文 :


我有一个接口列表:

private IList<IPlugin> plugins;

我想要一个访问器方法,允许用户获取所述接口的实现者列表:

public IList<T> GetPlugins<T>() where T : IPlugin
{
   // Create list
}

我看过多个迭代大会的例子。我已经实现了,因为我正在使用 MEF,所以我的plugins已经填充了继承 IPlugin 的导出类。

我遇到的问题是使用程序集的方法不会转换为我的列表设置。我不太精通 linq,不知道其他问题使用的内容与我试图实现的目标之间有什么不同。

这些是我看过的问题:

  • 问题1
  • 问题2

为清楚起见,请编辑:

假设我有一些课程:

public class Setting : IPlugin {}
public class AppearanceSetting : Setting {}
public class WebSettings : Setting {}

如果我有一个 IPlugin 列表,我想使用上面的访问器调用。

var settings = GetPlugins<Setting>(); // Get all implementors of Setting

我怎样才能从List做到这一点?我找到的示例都使用程序集。但是,如果我已经使用 MEF 完成了此操作,那么操纵 IList 以获取我需要的类的最佳方法是什么? 如果可能的话。

你可以这样获取插件类:

using System.Collections.Generic;
using System;
using System.Linq;
IEnumerable<Type> getAllTheTypes() {
    return AppDomain.CurrentDomain.GetAssemblies().SelectMany(ass => ass.GetTypes());
}
IEnumerable<Type> getPluginTypes<T>() where T : IPlugin {
    return getAllTheTypes()
        .Where(typeof(T).IsAssignableFrom);
}
IEnumerable<Type> getPluginClassesWithDefaultConstructor<T>() where T : IPlugin {
    return getPluginTypes<T>()
        .Where(cls => !cls.IsAbstract)
        .Where(cls => cls.GetConstructor(new Type[] { }) != null);
}

您可以实例化它们并制作列表:

List<T> makePlugins<T>() where T : IPlugin {
    return getPluginClassesWithDefaultConstructor<T>()
        .Select(cls => (T)cls.GetConstructor(new Type[] { }).Invoke(new object[] { }))
        .ToList();
}

但是,如果您只需要将List<IPlugin>转换为List<Setting>plugins.OfType<Setting>().ToList()可能是您想要的

最新更新