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.
|