2009-11-18 68 views

回答

4

這可用您可以使用Reflector找到派生類型已加載這些組件。

+0

任何細節,你如何做到這一點與反射? – RayLoveless 2013-08-21 15:32:55

5

如果使用ReSharper,你可以右鍵單擊一個類或方法標識符,然後選擇「轉到繼承」,它會彈出類或方法的所有實現的列表。

雖然Visual Studio默認沒有這個功能。如果你沒有ReSharper,你可以通過編譯你的.dll文件並在Reflector中分析它們來完成。

+0

這是正確的答案感謝 但是給出一個類(DbDataReader)我怎麼找到它實現了所有的接口? – 2009-11-18 17:50:56

+0

看看它在反射器,它表明你由一個類實現的所有接口。 – womp 2009-11-18 18:03:52

+0

你怎麼用反射鏡做到這一點? – RayLoveless 2013-08-21 15:32:10

0

你可以使用反射來查看特定的程序集並循環遍歷所有類型,以確定它的IDataReader等等。我不一定會在大多數情況下推薦這種方法,而且我也不相信內置任何東西。

1

鑑於類型的列表,你可以使用Type.IsAssignableFrom找到實現指定接口的類:

IEnumerable<Type> types = Assembly.LoadFrom("assemblyPath").GetTypes(); 
var impls = types.Where(t => typeof(TargetInterface).IsAssignableFrom(t) && t.IsClass); 
4

如果你談論在開發時瀏覽的組件,然後用靜態分析工具,如反射器(如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) 
     ); 
}