views:

277

answers:

5

I need to programmatically get a List of all the classes in a given namespace. How can I achieve this (reflection?) in C#?

+4  A: 

Without LINQ:

Try:

Type[] types = Assembly.GetExecutingAssembly().GetTypes();
List<Type> myTypes = new List<Type>();
foreach (Type t in types)
{
  if (t.Namespace=="My.Fancy.Namespace")
    myTypes.Add(t);
}
Wim Hollebrandse
Assembly.GetExecutingAssembly().GetTypes().ToList() will give you the list you want.
Gregory
Yes Greg, though technically, that is using a LINQ extension method and my example was meant to show this without having .NET 3.5
Wim Hollebrandse
clean non linq example though OP doesn't say that the assembly has already been loaded so the code might return an empty set eventhough the list should have been long and a name space might be in more assemblies :)
Rune FS
Fair point, I should have just created a method with an Assembly parameter as input and left the client call up to the OP altogether. ;-)
Wim Hollebrandse
Same namespaces in more assemblies is not how I would design it. Fine for base namespaces, but I definitely wouldn't have types in the same namespaces spread out over multiple assemblies. That's nasty.
Wim Hollebrandse
+3  A: 

See this post. Complete with example code.

David Lively
+1  A: 

Take a look at this http://stackoverflow.com/questions/949246/how-to-get-all-classes-within-namespace the answer provided returns an array of Type[] you can modify this easily to return List

Alan
+1  A: 

I can only think of looping through types in an assebly to find ones iin the correct namespace

public List<Type> GetList()
        {
            List<Type> types = new List<Type>();
            var assembly = Assembly.GetExecutingAssembly();
            foreach (var type in assembly .GetTypes())
            {
                if (type.Namespace == "Namespace")
                {
                    types.Add(type);
                }
            }
            return types;
        }
Pharabus
+5  A: 
var theList = Assembly.GetExecutingAssembly().GetTypes().ToList().Where(t => t.Namespace == "your.name.space").ToList();
klausbyskov
There's always the "one-liners". ;-)
Wim Hollebrandse
Yeah, you gotta love a one-liner :-)
klausbyskov