簡體   English   中英

從派生接口的列表中選擇類

[英]Selecting classes from a list of a derived interface

我有一個接口列表:

private IList<IPlugin> plugins;

我想要一個訪問器方法,該方法允許用戶獲取所述接口的實現者列表:

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

我看了大會反復進行的多個例子。 在使用MEF時,我已經實現了這一點,因此我的plugins已經裝有繼承IPlugin的導出類。

我遇到的問題是,使用Assembly的方法無法轉換為我的List設置。 我不太熟悉linq,不知道其他問題與我要實現的目標之間有什么區別。

這些是我看過的問題:

為清楚起見進行編輯:

假設我有一些課程:

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

如果我有一個IPlugin列表,並且我想使用上面的訪問器調用。

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

如何從List做到這一點? 我發現的所有示例都使用了Assembly。 但是,如果我已經使用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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM