Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C#

Following object inheritance

5.00/5 (3 votes)
31 Jul 2010CPOL 5K  
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...
C#
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
      }
   }
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)