65.9K
CodeProject is changing. Read more.
Home

Following object inheritance

starIconstarIconstarIconstarIconstarIcon

5.00/5 (3 votes)

Jul 28, 2010

CPOL
viewsIcon

5053

namespace System{ public static class SystemExtensionMethods { public static string GetAncestry( this object target ) { return string.Join( " -> ", target.GetTypes().Reverse().Select( t => FormatName( t ) ).ToArray() ); } public...

namespace System
{
   public static class SystemExtensionMethods
   {
      public static string GetAncestry( this object target )
      {
         return string.Join( " -> ",
            target.GetTypes().Reverse().Select( t => FormatName( t ) ).ToArray() );
      }

      public static IEnumerable<Type> GetTypes( this object target )
      {
         for( Type t = target.GetType(); t != null; t = t.BaseType )
            yield return t;
      }

      // Based on code from bjarneds, in:
      // http://www.codeproject.com/kb/dotnet/objectspy.aspx (ObjectInfo.cs)

      public static string FormatName( this Type type )
      {
         return FormatName( type, TypeNameLanguage.CSharp );
      }

      public static string FormatName( this Type type, TypeNameLanguage format )
      {
         if( !type.IsGenericType )
            return type.Name;
         int pos = type.Name.LastIndexOf( '`' );
         string name = ( pos >= 0 ? type.Name.Substring( 0, pos ) : type.Name );
         return name + (format == TypeNameLanguage.CSharp ? "<" : "(Of ")
            + string.Join( ",", type.GetGenericArguments()
                              .Select( t => FormatName( t, format ) ).ToArray() )
            + (format == TypeNameLanguage.CSharp ? ">" : ")");
      }

      public enum TypeNameLanguage
      {
         CSharp = 0, VB = 1
      }
   }
}