【问题标题】:Selecting classes from a list of a derived interface从派生接口列表中选择类
【发布时间】:2015-01-12 09:16:35
【问题描述】:

我有一个接口列表:

private IList<IPlugin> plugins;

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

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

我查看了多个迭代程序集的示例。我已经实现了这一点,因为我正在使用 MEF,所以我的 plugins 已经填充了继承 IPlugin 的导出类。

我遇到的问题是使用程序集的方法没有转换为我的列表设置。我不熟悉 linq,不知道其他问题使用的问题与我试图实现的问题之间有什么不同。

这些是我看过的问题:

为清楚起见进行编辑:

假设我有一些课程:

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 以获得我需要的类的最佳方法是什么?如果有可能的话。

【问题讨论】:

  • 我不确定问题出在哪里 - 您创建了一个 IPlugin 对象列表但不确定如何访问它?
  • 您需要更清楚地知道出了什么问题
  • 你问在哪里可以找到Type.FullName
  • 我做了一个补充来澄清我的问题。很抱歉最初的含糊不清。
  • 感谢您的澄清。我仍然想念清单的特别之处。你只是在找OfType吗?

标签: c#


【解决方案1】:

您可以通过这种方式获取插件类:

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&lt;IPlugin&gt; 转换为List&lt;Setting&gt;plugins.OfType&lt;Setting&gt;().ToList() 可能就是您想要的

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-19
    • 2012-04-16
    • 2013-01-14
    • 1970-01-01
    • 1970-01-01
    • 2019-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多