可能重複:
Getting all types that implement an interface with C# 3.5
How to find what class(es) implements an interface (.Net)尋找實現C#接口的所有類 - 類似於Java
這是可能在C#中喜歡它的Java?
如果我有一個接口名稱(IDataReader出於參數的緣故),我該如何獲得所有實現此類的類的列表?
在java中這是API中列出 - 在C#中
可能重複:
Getting all types that implement an interface with C# 3.5
How to find what class(es) implements an interface (.Net)尋找實現C#接口的所有類 - 類似於Java
這是可能在C#中喜歡它的Java?
如果我有一個接口名稱(IDataReader出於參數的緣故),我該如何獲得所有實現此類的類的列表?
在java中這是API中列出 - 在C#中
這可用您可以使用Reflector找到派生類型已加載這些組件。
如果使用ReSharper,你可以右鍵單擊一個類或方法標識符,然後選擇「轉到繼承」,它會彈出類或方法的所有實現的列表。
雖然Visual Studio默認沒有這個功能。如果你沒有ReSharper,你可以通過編譯你的.dll文件並在Reflector中分析它們來完成。
這是正確的答案感謝 但是給出一個類(DbDataReader)我怎麼找到它實現了所有的接口? – 2009-11-18 17:50:56
看看它在反射器,它表明你由一個類實現的所有接口。 – womp 2009-11-18 18:03:52
你怎麼用反射鏡做到這一點? – RayLoveless 2013-08-21 15:32:10
你可以使用反射來查看特定的程序集並循環遍歷所有類型,以確定它的IDataReader等等。我不一定會在大多數情況下推薦這種方法,而且我也不相信內置任何東西。
鑑於類型的列表,你可以使用Type.IsAssignableFrom找到實現指定接口的類:
IEnumerable<Type> types = Assembly.LoadFrom("assemblyPath").GetTypes();
var impls = types.Where(t => typeof(TargetInterface).IsAssignableFrom(t) && t.IsClass);
如果你談論在開發時瀏覽的組件,然後用靜態分析工具,如反射器(如Agent_9191建議)是你最好的選擇。如果你想在運行時做到這一點,那麼反思就是要走的路。無論哪種方式,您都需要定義搜索範圍:您想查看哪些程序集?
在開發時,這可能是容易的,反射器將讓你輕鬆通過裝載組件到其瀏覽器中指定這些。在運行時,這可能更困難。爲了避免貪婪地加載各種否則無用的組件,我假設你想通過所有當前加載集瀏覽,但是這可能是不正確的。出於這個原因,我會打破這個分爲兩個功能:
public static IEnumerable<Type> GetImplementations(Type interfaceType)
{
// this will load the types for all of the currently loaded assemblies in the
// current domain.
return GetImplementations(interfaceType, AppDomain.CurrentDomain.GetAssemblies());
}
public static IEnumerable<Type> GetImplementations(Type interfaceType, IEnumerable<Assembly> assemblies)
{
return assemblies.SelectMany(
assembly => assembly.GetExportedTypes()).Where(
t => interfaceType.IsAssignableFrom(t)
);
}
任何細節,你如何做到這一點與反射? – RayLoveless 2013-08-21 15:32:55