2010-11-15 42 views
2

我需要獲取應用程序中實現給定接口的所有對象。 我怎樣才能做到這一點?獲取在應用程序中實現接口的所有對象

謝謝

爲了澄清我找實例不是類型。


要再次澄清,我想生病需要做邪惡的東西一樣獲得我的AppDomain相關聯的所有線程和走他們的籌碼。

再次 - 我的老闆的想法......我想用IOC或AOP做的....

+0

反射(如你的標籤) – 2010-11-15 11:07:08

+2

可能的重複:http://stackoverflow.com/questions/26733/getting-all-types-that-implement-an- interface-with-c-3-5,http://stackoverflow.com/questions/302542/how-do-i-get-all-instances-of-all-loaded-types-that-implement-a-given-接口 – 2010-11-15 11:08:05

+0

您是否想要實現該接口的所有類的實例,或者所有實現該接口的類? – Guffa 2010-11-15 11:08:27

回答

2

這不能做。

要找到一個對象,你需要一個對象的引用。如果您沒有提及它,但想要「找到」它,這是不可能的。

+1

他想找到所有對象。但是你的代碼返回類列表。 – acoolaum 2010-11-15 11:18:42

1

這樣做的一種方法是使用MEF,它可能比使用標準反射更好。

http://mef.codeplex.com/

你基本上是一個屬性添加到您所有的接口實現,然後MEF可以掃描你的組件(和任何其他人在你告訴它掃描所有文件夾)的實現。

3

這將搜索所有加載的程序集。

AppDomain myDomain = AppDomain.CurrentDomain; 
Assembly[] loadedAssemblies = MyDomain.GetAssemblies(); 
foreach(Assembly assembly in loadedAssemblies) 
{ 
    Type[] types = assembly.GetTypes(); 
    foreach (Type type in types) 
    { 
     if (type.GetInterface(interface name) != null) 
      Console.WriteLine(type.Name); 
    } 
} 
+0

這只是查找類型,而不是實例。他需要某種IoC容器。這樣說,我確實發現你的代碼有用:) – 2016-03-22 13:55:18

0

所以你想找到實現特定接口的所有實例 - 而不是類,實際的對象。你需要以某種方式枚舉對象的實例。我不知道有這樣做的方法。

如果你可以,但是,建立某種形式的共同祖先的所有,你有(像自己對象類)相關的對象,那麼你可以添加通過註冊創建的所有實例的靜態枚舉他們在構造函數中。然後,您可以簡單地運行它們並檢查每個實例以查看它是否實現了該接口。當然,這種方法的問題在於,這些實例永遠不會被垃圾收集,即使您已經完成使用它們,因爲它們始終有一個指向它們的引用。

這使我想到,可能沒有「內置」方式來枚舉類或接口的實例,甚至不能枚舉內存中的所有實例,因爲有任何這樣的枚舉對象意味着即使你不再有對它們的引用,這些實例也永遠不會被垃圾收集,因爲它們仍然可以被「引用」。這個想法徹底地解決了託管代碼中的所有問題......因此,除非您找到自己的方式來枚舉這些實例,否則我認爲您無法做到這一點。

希望幫助:-)使用

相關問題