This is something pretty cool that LINQ can be used for: querying information on Reflection data. For instance, the query below creates a list of all classes that are subclasses of the Exception class within the currently loaded assemblies. It also lists the properties declared at the subclasses level, making it easier to spot the properties that haven’t been inherited from the baseclass:
var exceptionClasses = from assembly in AppDomain.CurrentDomain.GetAssemblies() from type in assembly.GetTypes() where type.IsSubclassOf(typeof(Exception)) from prop in type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) select new { AssemblyName = assembly.GetName().Name,
TypeName = type.Name,
PropertyName = prop.Name }; foreach (var item in exceptionClasses) { Console.WriteLine(
String.Format("assembly = {0} | type = {1} | prop = {2}", item.AssemblyName, item.TypeName, item.PropertyName)); }
The query below gets all classes that implemented IEnumerable<T>, available on the currently loaded assemblies:
var query = from assembly in AppDomain.CurrentDomain.GetAssemblies() from type in assembly.GetTypes() from method in type.GetMethods() where method.IsStatic && method.ReturnType.GetInterface("IEnumerable`1") != null orderby method.DeclaringType.Name, method.Name group method by new { Class = method.DeclaringType.Name, Method = method.Name }; foreach (var item in query) { Console.WriteLine( item.Key.Class + " - " + item.Key.Method); }
The last query I got from the following book (which is a great introduction to LINQ, by the way):
![]() |
Introducing Microsoft LINQ by Paolo Pialorsi, Marco Russo |