The Family Tree of XSLT SharePoint WebParts

I had some trouble with some SharePoint webparts and what they seemed to have in common was a base type called the BaseXsltDataWebPart.

I could resolve it on a case by case basis but ideally I really wanted to know all the types that derived at some point from the BaseXsltDataWebPart. So I wrote this:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
namespace DerivedTypes {
    class Program {
        static void Main(string[] args) {
            Type sample1 = typeof(Microsoft.SharePoint.Publishing
                  .WebControls.SummaryLinkWebPart);

            Type baseType = typeof(Microsoft.SharePoint
                        .WebPartPages.BaseXsltDataWebPart);

            foreach (var s in GetDerivedTypes(sample1,baseType)
                  .Union(GetDerivedTypes(baseType,baseType))) {
                Console.WriteLine(s.Name);
            }
        }

        public static IEnumerable GetDerivedTypes(Type webpartSampleType, 
          Type baseType) { 
            var inheritted = Assembly.GetAssembly(webpartSampleType)
                        .GetExportedTypes()
                        .Where(type => type.IsSubclassOf(baseType));

            return inheritted;
        }
    }
}

It yields a list of all the SharePoint webparts contained in Microsoft.SharePoint and Microsoft.SharePoint.Publishing assemblies that inherit from the base xslt webpart that was causing the issue.

Interestingly enough if I call .GetTypes() on the assembly it blows up with a reflection error, the stack trace points to dotfuscator, so presumably some sort of anti-ildasm feature is enabled for reflecting private types, still I only needed the publicly surfaced web parts anyway so not a major problem.