2014-01-08 44 views
0

已解決。在運行時枚舉類型的所有實例?

我想知道是否有人知道是否有可能在運行時獲得特定類型的所有實例化類型?

假設我想枚舉類型爲Foo的所有實例化對象。

public class Foo {} 

var foo1 = new Foo(); 
Foo foo2 = new Foo(); 

IEnumerable<Foo> foos = GetObjects<Foo>(); 
//foos should contain foo1 and foo2 

如果沒有這樣做的直接的方式,那麼我可能只是使訂閱其對自身建設的一些靜態服務基本類型,然後執行查找這樣...但我覺得這一點必須已經在GC上實施。


我會給你最正確的答案,如果我可以,但因爲我不能,我給它的第一人回答。

+0

你爲什麼擔心內存分配?只是好奇。 – Thraka

+0

這將在一直運行的服務器上運行。所以我不想在GC不收集大量我不在乎的對象的地方發生準內存泄漏。 – JohnDoe

+0

在某個時候你遇到過這個問題嗎?這是一篇關於GC的酷文章http://blogs.msdn.com/b/dotnet/archive/2012/07/20/the-net-framework-4-5-includes-new-garbage-collector-enhancements- for-client-and-server-apps.aspx – Thraka

回答

5

恐怕沒有什麼像現有的框架之內。

你必須通過你自己的,例如使用保持構造實例的軌道內部列表。

public class Foo 
{ 
    private static List<Foo> _instances = new List<Foo>(); 

    public Foo() 
    { 
     _instances.Add(this); 
    } 

    public static IEnumerable<Foo> Instances { get { return _instances; } } 
} 

你可以使用WeakReference允許反正GC收集這些情況下,當沒有其他參考保持。

public class Foo 
{ 
    private static List<WeakReference<Foo>> _instances = new List<WeakReference<Foo>>(); 
    public Foo() 
    { 
     _instances.Add(new WeakReference<Foo>(this)); 
    } 

    public static IEnumerable<Foo> Instances 
    { 
     get 
     { 
      foreach(var r in _instances) 
      { 
       Foo instance; 
       if (r.TryGetTarget(out instance)) 
        yield return instance; 
      } 
     } 
    } 
} 
+0

我不知道WeakReference,這非常酷(並且方便)。我可能會使用WeakReference,所以我沒有不必要的內存分配......謝謝! – JohnDoe

3

在這種情況下,如果沒有與內存消耗沒有問題,您也可以使用同一個類實例的本地靜態集合。這樣在構造函數中,您可以將每個新實例添加到該集合中。

然後在情況下,只要你想知道你可以從這個地方靜電收集像下面得到它的所有實例...

class Foo 
{ 
    public static List<Foo> Instances = new List<Foo>(); 
    public Foo() 
    { 
    Instances.Add(this); 
    } 
    //can be accessed like below 
    Foo.Instances 
} 

這可能會幫助您解決問題。