Recipe 12.8 Finding the Subclasses of a Type

Problem

You have a type and you need to find out whether it is subclassed anywhere in an assembly.

Solution

Use the Type.IsSubclassOf method to test all types within a given assembly, which determines whether each type is a subclass of the type specified in the argument to IsSubClassOf :

 public static ArrayList GetSubClasses(string asmPath, Type baseClassType) {     Assembly asm = Assembly.LoadFrom(asmPath);     ArrayList subClasses = new ArrayList( );     if (baseClassType != null)     {         foreach(Type type in asm.GetTypes( ))         {             if (type.IsSubclassOf(baseClassType))             {                 subClasses.Add(type);             }         }     }     else     {         throw (new Exception(baseClassType.FullName +                          " does not exist in assembly " + asmPath));     }     return (subClasses); 

The GetSubClasses method accepts an assembly path string and a second string containing a fully qualified base class name . This method returns an ArrayList of Types representing the subclasses of the type passed to the baseClass parameter.

Discussion

The IsSubclassOf method on the Type class allows us to determine whether the current type is a subclass of the type passed in to this method.

To use this method, you could use the following code:

 public static void FindSubclassOfType( ) {     Process current = Process.GetCurrentProcess( );     // get the path of the current module     string asmPath = current.MainModule.FileName;     Type type = Type.GetType("CSharpRecipes.Reflection+BaseOverrides");     ArrayList subClasses = GetSubClasses(asmPath,type);                  // write out the subclasses for this type         if(subClasses.Count > 0)     {         Console.WriteLine("{0} is subclassed by:",type.FullName);         foreach(Type t in subClasses)         {             Console.WriteLine("\t{0}",t.FullName);         }     } } 

First we get the assembly path from the current process, and then we set up use of CSharpRecipes.Reflection+BaseOverrides as the type to test for subclasses. We call GetSubClasses , and it returns an ArrayList that we use to produce the following output:

 CSharpRecipes.Reflection+BaseOverrides is subclassed by:         CSharpRecipes.Reflection+DerivedOverrides 

See Also

See the "Assembly Class" and "Type Class" topics in the MSDN documentation.



C# Cookbook
C# 3.0 Cookbook
ISBN: 059651610X
EAN: 2147483647
Year: 2003
Pages: 315

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net