[英]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.