views:

220

answers:

5

Is there a way to iterate over instances of a class in C#? These instances are not tracked or managed in a collection.

+7  A: 

Not inside the regular framework. You would need to track them manually.

You can, however, do this in windbg/sos - mainly for debugging purposes (not for routine code).

Marc Gravell
Or you can use the Profiling API - http://msdn.microsoft.com/en-us/magazine/cc188781.aspx
Pavel Minaev
+1  A: 

You have to have references to them somewhere, or at least know where to look, so in identifying them you'd probably put them into a collection which you'd then iterate.

If you don't know where the references live, then you'd have to have to introduce some kind of tracking mechanism. Perhaps a static collection on the type? It would have to be implemented carefully though.

AdamRalph
+1  A: 

Not directly.

You could conceptually have your object place a copy of itself into some well-known place (e.g. a static collection) and then use that to iterate, but then you'd have to make sure you cleared the instance out of that collection at some point or else it'll never get garbage collected.

Paul
Perhaps use `WeakReference` in the collection; but either way, I think it goes against the "These instances are not tracked or managed in a collection." in the question.
Marc Gravell
A: 

As Marc said, if you want to do it in code, you would need to keep a collection of them. If you are debugging, have a look at this blog post: http://blogs.msdn.com/tess/archive/2006/01/23/516139.aspx

If you need a collection in memory of all of the object instances of a certain type, you could consider using a collection of System.WeakRef's A weak ref is a reference that does not keep the object that it references. This would let you keep a collection of weak-refs to the object instances you want to enumerate. Have a look at Weakrefs in the help for more info.

JMarsch
A: 

In the comment thread on this post there is an interesting discussion and solution related to this question.

Wil P