I need to programmatically get a List of all the classes in a given namespace. How can I achieve this (reflection?) in C#?
-
How annoying when a question gets marked as a duplicate and the original is not referenced.War– War2014-11-09 15:06:44 +00:00Commented Nov 9, 2014 at 15:06
Add a comment
|
4 Answers
var theList = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.Namespace == "your.name.space")
.ToList();
4 Comments
Wim
There's always the "one-liners". ;-)
Klaus Byskov Pedersen
Yeah, you gotta love a one-liner :-)
War
This assumes the whole namespace is in the current assembly, A partial solution at best.
Warren LaFrance
War, what would be a better solution then?
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);
}
5 Comments
Gregory
Assembly.GetExecutingAssembly().GetTypes().ToList() will give you the list you want.
Wim
Yes Greg, though technically, that is using a LINQ extension method and my example was meant to show this without having .NET 3.5
Rune FS
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 :)
Wim
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
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.
Take a look at this How to get all classes within namespace? the answer provided returns an array of Type[] you can modify this easily to return List
Comments
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;
}