2014-11-14 49 views
0

我有一個接口的列表:從派生的接口的列表中選擇類

private IList<IPlugin> plugins; 

我想有一個訪問方法,使用戶獲得的實施者名單說接口:

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

我看了多個例子,大會迭代。我已經實現了這一點,因爲我正在使用MEF,因此我的plugins已經填充了繼承IPlugin的導出類。

我遇到的問題是使用程序集的方法不能轉換到我的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以獲得我需要的類的最佳方法是什麼?如果這甚至是可能的。

+1

我不確定問題是什麼 - 你已經創建了一個IPlugin對象列表,但不確定ho要訪問它? – 2014-11-14 21:34:34

+0

你需要更清楚一些什麼是錯的 – BradleyDotNET 2014-11-14 21:35:13

+0

你問在哪裏可以找到[Type.FullName](http://msdn.microsoft.com/en-us/library/system.type.fullname(v = vs.110)的.aspx)? – 2014-11-14 21:36:02

回答

2

你可以得到插件類這種方式:

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()可能是什麼你想要