public static LogItem LogAsToString(string message, object o, ImageType i) { string[] lines = o.ToString().Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries); if (lines.Length == 1) { return(new LogItem(message + ": " + lines[0], i)); } else { LogItem[] events = Array.ConvertAll <string, LogItem>(lines, delegate(string s) { return(new LogItem(s, ImageType.NoImage)); }); LogItem r = new LogItem(message, i); foreach (LogItem e in events) { r.Add(e); } return(r); } }
public static LogItem LogValue(string name, object value, ImageType image) { if (value == null) { value = "null"; // to avoid NullReferenceExceptions } List <Type> candidates = new List <Type>(typesHandled); // Remove the types which can't handle value candidates.RemoveAll(delegate(Type t) { return(!t.IsInstanceOfType(value)); }); // Ensure we used the most derived type candidates.RemoveAll(delegate(Type t) { foreach (Type t2 in candidates) { if (t2.IsSubclassOf(t)) { return(true); } } return(false); }); List <TypeHandler> handlerCands = candidates.ConvertAll <TypeHandler>(delegate(Type t) { return(typeHandlers[t]); }); Type ty = value.GetType(); if (ty.IsDefined(typeof(LogByMembersAttribute), true)) { handlerCands.Add(LogByMembers); } if (ty.IsDefined(typeof(CustomLoggerAttribute), true)) { CustomLoggerAttribute[] c = (CustomLoggerAttribute[])ty.GetCustomAttributes(typeof(CustomLoggerAttribute), true); Debug.Assert(c.Length == 1); handlerCands.Add(c[0].CustomLogger); } if (handlerCands.Count == 0 || ty.IsDefined(typeof(LogAsToStringAttribute), true)) { handlerCands.Add(LogAsToString); } // We are guaranteed to have at least one logger: LogAsToString if (handlerCands.Count == 1) { return(handlerCands[0](name, value, image)); } else { LogItem i = new LogItem(name, image); i.Warn(string.Format("More than 1 loggers are defined for type '{0}'.", ty)); foreach (TypeHandler t in handlerCands) { i.Add(t("Value", value, ImageType.NoImage)); } return(i); } }