/* * Created by SharpDevelop. * User: elijah * Date: 12/25/2011 * Time: 2:43 PM * * To change this template use Tools | Options | Coding | Edit Standard Headers. */ using System; using System.Reflection; using System.Text; namespace SharpLua { /// /// Provides a tool inspecting objects arbitrary objects as part of the /// debugging process /// public class Inspector { /// /// Reflects over all the fields of an object /// /// /// public static string Fields(Object o) { StringBuilder stringBuilder = new StringBuilder(); FieldInfo[] fieldInfos = o.GetType().GetFields(BindingFlags.Public | BindingFlags.Instance | BindingFlags.NonPublic); foreach (FieldInfo fieldInfo in fieldInfos) { stringBuilder.AppendFormat("\tfield {0} = {1};\r\n", fieldInfo.ToString(),fieldInfo.GetValue(o) ); } return stringBuilder.ToString(); } /// /// Reflects over all the methods of an object /// /// /// public static string Methods(Object o) { StringBuilder stringBuilder = new StringBuilder(); MethodInfo[] methodInfos = o.GetType().GetMethods(); foreach (MethodInfo methodInfo in methodInfos) { stringBuilder.Append ("\t"); if (methodInfo.IsPublic) stringBuilder.Append ("public "); if (methodInfo.IsPrivate) stringBuilder.Append ("private "); if (methodInfo.IsAbstract) stringBuilder.Append ("abstract "); if (methodInfo.IsStatic) stringBuilder.Append ("static "); stringBuilder.AppendFormat("{0}\r\n", methodInfo.ToString()); } return stringBuilder.ToString(); } /// /// Reflects over all the events for an object /// /// /// public static string Events(Object o) { StringBuilder stringBuilder = new StringBuilder(); EventInfo[] eventInfos = o.GetType().GetEvents(); foreach (EventInfo eventInfo in eventInfos) { stringBuilder.Append ("\tevent "); if (eventInfo.IsMulticast) stringBuilder.Append ("multicast "); stringBuilder.AppendFormat("{0}\r\n", eventInfo.ToString()); } return stringBuilder.ToString(); } /// /// Reflects over all the properties for an object /// /// /// public static string Properties(Object o) { StringBuilder stringBuilder = new StringBuilder(); PropertyInfo[] propertyInfos = o.GetType().GetProperties(); foreach (PropertyInfo propertyInfo in propertyInfos) { stringBuilder.AppendFormat("\tproperty {0}\r\n", propertyInfo.ToString()); } return stringBuilder.ToString(); } /// /// Reflects over a type object /// /// /// public static string TypeInfo(Type type) { StringBuilder stringBuilder = new StringBuilder(); if (type.IsPublic) stringBuilder.Append("public "); if (type.IsAbstract) stringBuilder.Append("abstract "); if (type.IsByRef) stringBuilder.Append("byref "); if (type.IsSealed) stringBuilder.Append("sealed "); if (type.IsImport) stringBuilder.Append("import "); if (type.IsClass) stringBuilder.Append("class "); if (type.IsArray) stringBuilder.Append("array "); if (type.IsCOMObject) stringBuilder.Append("comobject "); if (type.IsEnum) stringBuilder.Append("enum "); if (type.IsInterface) stringBuilder.Append("interface "); if (type.IsPointer) stringBuilder.Append("pointer "); stringBuilder.AppendFormat("{0} {{\r\n", type.Name); return stringBuilder.ToString(); } /// /// Inspects an object by reflecting over its values and meta data /// /// /// public static string Inspect(Object o) { if (o == null) return "null"; StringBuilder stringBuilder = new StringBuilder(); stringBuilder.Append(string.Format("// Value={0}\r\n",o)); stringBuilder.Append(TypeInfo(o.GetType())); stringBuilder.Append(Fields(o)); stringBuilder.Append(Properties(o)); stringBuilder.Append(Methods(o)); stringBuilder.Append(Events(o)); stringBuilder.Append("}\r\n"); return stringBuilder.ToString(); } } }